Динамический или тип объекта
Я использовал динамический и тип объекта взаимозаменяемо. Есть ли разница между этими двумя типами? Есть ли какие-либо последствия для производительности использования одного над другим? Какой из них более гибкий?
5 ответов
Они очень разные.
Если вы используете dynamic
вы выбираете динамическую типизацию и, таким образом, по большей части отказываетесь от проверки во время компиляции. И да, это менее эффективно, чем использование статической типизации, где вы можете использовать статическую типизацию.
Тем не менее, вы не можете многое сделать с object
типа в любом случае - у него почти нет членов. Где вы находите себя, используя его? Если вы хотите написать код общего назначения, который может работать с различными типами, вы обычно должны рассматривать дженерики, а не object
,
С развитием языка C# мы видим, что даже тип var сопоставим с динамическим и объектным типами. Вот все 3 типа, как я узнал, сравнивая эти 7 пунктов:
объект
- Объект был представлен с C# 1.0.
- Он может хранить любые значения, потому что объект является базовым классом всех типов в.NET Framework.
- Компилятор имеет мало информации о типе.
- Тип объекта может быть передан как аргумент метода, а метод также может возвращать тип объекта.
- Нужно привести объектную переменную к исходному типу, чтобы использовать ее и выполнять нужные операции.
- Вызвать проблему во время выполнения, если сохраненное значение не преобразуется в базовый тип данных.
- Полезно, когда у нас нет больше информации о типе данных.
Var
- Вар был представлен с C# 3.0
- Он может хранить значения любого типа, но при инициализации обязательно инициализировать типы var.
- Это безопасный тип, т.е. компилятор имеет всю информацию о сохраненном значении, поэтому он не вызывает проблем во время выполнения.
- Тип var не может быть передан как аргумент метода, а метод не может возвращать тип объекта. Тип Var работает в области, где он определен.
- Нет необходимости приводить, потому что у компилятора есть вся информация для выполнения операций.
- Не вызывает проблем, потому что компилятор имеет всю информацию о сохраненном значении.
- Полезно, когда мы не знаем фактический тип, т.е. тип является анонимным.
динамический
- Динамический был введен с C# 4.0
- Он может хранить переменные любого типа, аналогичные старой языковой переменной VB.
- Он не является безопасным по типу, т.е. компилятор не имеет никакой информации о типе переменной.
- Динамический тип может передаваться как аргумент метода, а метод также может возвращать динамический тип.
- Приведение не требуется, но вам необходимо знать свойства и методы, относящиеся к хранимому типу.
- Вызывает проблему, если к неправильным свойствам или методам обращаются, потому что вся информация о сохраненном значении получает разрешение только во время выполнения.
- Полезно, когда нам нужно кодировать, используя отражающие или динамические языки или COM-объекты, потому что вам нужно писать меньше кода.
Надеюсь, это кому-нибудь поможет.
Спасибо!
На простом языке:
Предположим, у нас есть следующий метод:
public static void ConsoleWrite(string inputArg)
{
Console.WriteLine(inputArg);
}
Объект: следующий код имеет ошибку компиляции, если объект не приведен к строке:
public static void Main(string[] args)
{
object obj = "String Sample";
ConsoleWrite(obj);// compile error
ConsoleWrite((string)obj); // correct
Console.ReadKey();
}
динамический: следующий код успешно компилируется, но если он содержит значение, кроме string
выдает ошибку во время выполнения
public static void Main(string[] args)
{
dynamic dyn = "String Sample";
ConsoleWrite(dyn); // correct
dyn = 1;
ConsoleWrite(dyn);// Runtime Error
Console.ReadKey();
}
Динамический: приведение типов не требуется, но вам необходимо знать свойства и методы, связанные с хранимым типом, чтобы избежать ошибок во время выполнения.
dynamic dyn = 1;
Console.WriteLine(dyn);
int a = dyn;// works fine
Console.WriteLine(a);//print 1
Console.ReadKey();
Приведенный выше код будет работать нормально, но если указать dyn = 1.2, он выдаст исключение, поскольку 1.2 не может быть преобразован в int.
Объект: Требовать явного приведения объектной переменной.
object ob = 1;//or 1.2
Console.WriteLine(ob);
int a = ob;//Compile error because explicit casting is not done
Console.WriteLine(a);
Console.ReadKey();
Скрипка: https://dotnetfiddle.net/l5K4Cl
В статье описаны различные типы, включая объектные и динамические. В статье также объясняется разница между ними на хорошем примере.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/reference-types
Я кратко опишу разницу, описанную в статье:
Тип объекта - это псевдоним System.Object в.NET. В унифицированной системе типов C# все типы, предопределенные и определяемые пользователем, ссылочные типы и типы значений прямо или косвенно наследуются от System.Object. Вы можете присваивать значения любого типа переменным типа object.
Динамический тип указывает, что использование переменной и ссылки на ее члены обходят проверку типа во время компиляции. Вместо этого эти операции разрешаются во время выполнения. Динамический тип упрощает доступ к COM API, таким как API автоматизации Office, к динамическим API, таким как библиотеки IronPython, и к объектной модели документа HTML (DOM).
Динамический тип в большинстве случаев ведет себя как типовой объект. В частности, любое ненулевое выражение может быть преобразовано в динамический тип. Динамический тип отличается от объекта тем, что операции, содержащие выражения типа динамический, не разрешаются или тип не проверяется компилятором. Компилятор объединяет информацию об операции, и эта информация позже используется для оценки операции во время выполнения. Как часть процесса, переменные типа dynamic компилируются в переменные типа object. Следовательно, тип dynamic существует только во время компиляции, а не во время выполнения.
Резюме:
По сути, это означает, что объект является типом, а все остальные типы наследуются от него. Dynamic - это не совсем тип, это больше похоже на указатель или представление некоторого другого типа, который будет разрешен во время выполнения.