Подтвердить что ты не робот

Разница между объектом, динамическим и Var

Мне нужно знать разницу между этими тремя ключевыми словами Object, Dynamic и var в С#.

Я видел эту ссылку но я не понимаю, в каком случае я должен использовать каждый.

Можете ли вы объяснить мне, пожалуйста, разницу между этими ключевыми словами? Каковы утилиты для каждого ключевого слова?

4b9b3361

Ответ 1

Все Object это базовый тип. Каждый тип наследует от Object за мгновение, простая переменная int может быть бокс для Object. Например:

object a = 10; // int
object b = new Customer(); // customer object
object c = new Product(); // product object
object d = "Jon"; // string
object e = new { Name = "Felipe", Age = 20 }; // anonymous type

Это самая абстракция для любого типа, и это ссылочный тип. Если вы хотите получить реальный тип, вам нужно unbox его (используя стратегию конверсии, такую ​​как методы, приведения и т.д.):

object a = "Some Text";
string text = a.ToString();

// call a string method
text = text.ToUpper();

object i = 10; // declared as object but instance of int
int intValue = (int) i; //declare as an int ... typed

Dynamic представляет собой реализацию динамического аспекта в С#, он не сильно типизирован. Например:

dynamic a = new Class();
a.Age = 18;
a.Name = "Jon";
a.Product = new Product();

a.Name; // read a string
a.Age; // read an int
a.Product.Name; // read a property
a.Product.MoveStock(-1); // call a method from Product property.

var - это просто ключевое слово языка С#, которое позволяет вам определить любой объект типа, поскольку вы инициализируете его значением, и он определит тип из этого значения, например:

var a = 10; // int
var b = 10d; // double
var c = "text"; // string
var p = new Product(); // Product type

Компилятор проверяет тип указанного вами значения и задает его на объекте.

Ответ 2

Объект:

Каждый объект в С# является производным от типа объекта, прямо или косвенно. Это переменная времени компиляции и требует преобразования и распаковки для преобразования, и это делает его медленным. Вы можете изменить тип значения на ссылочный тип и наоборот.

public void CheckObject()
{
    object test = 10;
    test = test + 10;    // Compile time error
    test = "hello";      // No error, Boxing happens here
}

Var:

Это переменная времени компиляции и не требует упаковки и распаковки. Поскольку Var является функцией времени компиляции, вся проверка типов выполняется только во время компиляции. После того, как Var был инициализирован, вы не можете изменить тип, хранящийся в нем.

public void CheckVar()
{
    var test = 10;         // after this line test has become of integer type
    test = test + 10;      // No error
    test = "hello";        // Compile time error as test is an integer type
}

Динамический:

Это переменная времени выполнения и не требует упаковки и распаковки. Вы можете присвоить и значение динамическому, а также можете изменить тип значения, хранящийся в том же. Все ошибки в динамике могут быть обнаружены только во время выполнения. Можно также сказать, что динамический - это объект времени выполнения, который может содержать данные любого типа.

public void CheckDynamic()
{
    dynamic test = 10;
    test = test + 10;     // No error
    test = "hello";       // No error, neither compile time nor run time
}

Ответ 3

1) var используется для неявного определения типа. Например, если вы определяете переменную следующим образом:

var number = 123;

Компилятор выводит тип на основе назначенного значения и вашей переменной, инициализированной как целое число во время компиляции. После этого определения вы не можете присвоить string вашей переменной, потому что она является целым числом. И вы не можете использовать var следующим образом:

var number;
number = 123;

Потому что вы должны назначить что-то своей переменной, если вы используете ключевое слово var чтобы можно было определить тип.

2) Object является базовым классом для всех классов. В C# все классы наследуются от класса объекта, поэтому вы можете назначить все объекту. Например:

object str = "bla bla bla..."; 
str = 234;
str = DateTime.Now;

Это работает, потому что когда вы делаете этот бокс/распаковка, выполняется автоматически для вас. И в отличие от ключевого слова var вы можете использовать object следующим образом:

object myVariable;
myVariable = "bla bla bla..";

3) dynamic - это классная функция, которая поставляется с C# 4.0, вы можете использовать dynamic если вы не знаете, возвращаемый тип из вашей функции во время компиляции. Ваш тип будет определен во run-time Поэтому вы не можете использовать intellisense с динамические переменные.

Вы можете использовать динамический как это:

dynamic myObj = SomeMethod();
myObj.DoSomething();
myObj.Method1();

Но вы должны быть осторожны при использовании dynamic.Because, если вы вызываете метод или свойство, которое не существует, вы получите RuntimeBinderException во время выполнения.

И последнее, что я хочу упомянуть, dynamic и object тип могут быть типом параметра, а var нет. Например, вы можете сделать это:

public void SomeMethod(dynamic arg1)

Но вы не можете сделать это:

public void SomeMethod(var arg1)

Потому что var - это не тип, а синтаксический сахар, позволяющий компилятору определить тип для вас.

Ответ 4

Object - это корневой класс, из которого извлекаются все .net-объекты.

var используется как ярлык, если вы не хотите писать say string x = "a", но вместо этого пишите var x = "a". Он работает только в том случае, если компилятор может понять, что вы имеете в виду.

dynamic подразумевает, что то, что вы делаете с объектом, вызывается только во время выполнения (x.StrangeMethod() не приведет к ошибке компиляции, даже если метод не существует), полезно при взаимодействии со скриптовыми языками.

Ответ 5

Его довольно простой...

Объект - это базовый тип в .NET. Все остальные типы наследуются от него. Поэтому переменная типа объекта может содержать все. Но это должно быть сделано только, нет других вариантов по следующим причинам:

  • Прежде чем читать/записывать эту переменную, мы должны выполнить операции unboxing/boxing, которые являются дорогостоящими.

  • Компилятор не может проверять тип во время компиляции, что может привести к ошибкам и исключениям во время выполнения. Например, этот код будет скомпилирован успешно, но выведите исключение во время выполнения:

    object o = "2"; 
    int i = 1 + (int)o;
    

Var не является типом, но инструкция для компилятора заключает тип переменной из контекста программы. Он необходим для анонимных методов, но также может использоваться везде, где вы пожелаете. Остерегайтесь, чтобы ваша программа не стала трудно читать. Компилятор принимает решение во время компиляции, поэтому он не будет влиять на эффективность программы.

Динамический - это особый тип, для которого компилятор не проверяет тип во время компиляции. Тип указан во время выполнения CLR. Это статический (!) Тип, и после указания типа переменной его нельзя изменить позже. Мы должны использовать этот тип только, нет других вариантов по аналогичным причинам с типом объекта:

  • Существует операция добавления, указывающая тип во время выполнения - что снижает эффективность программы.

  • Компилятор не выполняет проверку типов, что может привести к ошибкам и исключениям во время выполнения.

Ответ 6

Ниже приведены различия между System.Object, dynamic и var.

Все в .net происходит из типа System.Object. Но если вы ищете конкретную разницу, вот они.

Разница между объектом и динамикой.

1. Вы не можете неявно использовать переменную типа Object в любом другом типе. Компилятор не позволит вам это сделать. С другой стороны, вы   может косвенно приводить любой тип к динамическому. Компилятор не будет жаловаться   потому что кастинг будет выполняться во время выполнения и исключения, если   требуется во время выполнения.   2. Потому что динамика такая же, как и объект. Вы не можете писать перегруженные методы, которые отличаются в Object и dynamic в аргументах.

Разница между динамическими и var.

1. Появление локальной переменной как динамической или var имеет только синтаксическую разницу. 2. Вы не можете объявить переменную типа var без ее инициализации, но вы можете сделать это для динамической переменной 3. Вы не можете использовать переменную var для передачи в качестве аргумента метода или возврата из метода. 4. Вы не можете передать выражение в var, но вы можете сделать это для динамической переменной.

Ответ 7

Объект

Базовый объект .net, большую часть времени вам не нужно будет использовать.

Var

Просто синтаксический сахар, всякий раз, когда вы используете var, тип переменной будет определяться во время компиляции в соответствии со значением, присвоенным ему.

Динамический

Поставляется из DLR-части .net, вам понадобится только его, если вы хотите использовать нестандартный тип ввода.

Ответ 9

компилятор говорит, что var - это контекстное ключевое слово, используемое для объявления переменных. Вот почему нам нужно присвоить значение во время объявления. Затем компилятор проверяет их тип данных и обрабатывает его таким же образом. Таким образом, компилятор знает все об этой переменной и подразумевает безопасность типов.