Разница между объектом, динамическим и Var
Мне нужно знать разницу между этими тремя ключевыми словами Object
, Dynamic
и var
в С#.
Я видел эту ссылку но я не понимаю, в каком случае я должен использовать каждый.
Можете ли вы объяснить мне, пожалуйста, разницу между этими ключевыми словами? Каковы утилиты для каждого ключевого слова?
Ответы
Ответ 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, вам понадобится только его, если вы хотите использовать нестандартный тип ввода.
Ответ 8
Сумма различий между объектами, переменными и динамическими типами. Если вы не понимаете концепции в каждой ячейке строки таблицы, пожалуйста, обратитесь к ней где-нибудь еще. Источник: https://www.dotnettricks.com/learn/csharp/differences-between-object-var-and-dynamic-type
![Image showing the comparison among Object, Var and Dynamic]()
Ответ 9
компилятор говорит, что var - это контекстное ключевое слово, используемое для объявления переменных. Вот почему нам нужно присвоить значение во время объявления. Затем компилятор проверяет их тип данных и обрабатывает его таким же образом. Таким образом, компилятор знает все об этой переменной и подразумевает безопасность типов.