Динамический или тип объекта

Я использовал динамический и тип объекта взаимозаменяемо. Есть ли разница между этими двумя типами? Есть ли какие-либо последствия для производительности использования одного над другим? Какой из них более гибкий?

5 ответов

Решение

Они очень разные.

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

Тем не менее, вы не можете многое сделать с object типа в любом случае - у него почти нет членов. Где вы находите себя, используя его? Если вы хотите написать код общего назначения, который может работать с различными типами, вы обычно должны рассматривать дженерики, а не object,

С развитием языка C# мы видим, что даже тип var сопоставим с динамическим и объектным типами. Вот все 3 типа, как я узнал, сравнивая эти 7 пунктов:

объект

  1. Объект был представлен с C# 1.0.
  2. Он может хранить любые значения, потому что объект является базовым классом всех типов в.NET Framework.
  3. Компилятор имеет мало информации о типе.
  4. Тип объекта может быть передан как аргумент метода, а метод также может возвращать тип объекта.
  5. Нужно привести объектную переменную к исходному типу, чтобы использовать ее и выполнять нужные операции.
  6. Вызвать проблему во время выполнения, если сохраненное значение не преобразуется в базовый тип данных.
  7. Полезно, когда у нас нет больше информации о типе данных.

Var

  1. Вар был представлен с C# 3.0
  2. Он может хранить значения любого типа, но при инициализации обязательно инициализировать типы var.
  3. Это безопасный тип, т.е. компилятор имеет всю информацию о сохраненном значении, поэтому он не вызывает проблем во время выполнения.
  4. Тип var не может быть передан как аргумент метода, а метод не может возвращать тип объекта. Тип Var работает в области, где он определен.
  5. Нет необходимости приводить, потому что у компилятора есть вся информация для выполнения операций.
  6. Не вызывает проблем, потому что компилятор имеет всю информацию о сохраненном значении.
  7. Полезно, когда мы не знаем фактический тип, т.е. тип является анонимным.

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

  1. Динамический был введен с C# 4.0
  2. Он может хранить переменные любого типа, аналогичные старой языковой переменной VB.
  3. Он не является безопасным по типу, т.е. компилятор не имеет никакой информации о типе переменной.
  4. Динамический тип может передаваться как аргумент метода, а метод также может возвращать динамический тип.
  5. Приведение не требуется, но вам необходимо знать свойства и методы, относящиеся к хранимому типу.
  6. Вызывает проблему, если к неправильным свойствам или методам обращаются, потому что вся информация о сохраненном значении получает разрешение только во время выполнения.
  7. Полезно, когда нам нужно кодировать, используя отражающие или динамические языки или 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 - это не совсем тип, это больше похоже на указатель или представление некоторого другого типа, который будет разрешен во время выполнения.

Другие вопросы по тегам