динамический или тип объекта - PullRequest
24 голосов
/ 09 августа 2010

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

Ответы [ 3 ]

36 голосов
/ 09 августа 2010

Они сильно отличаются.

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

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

5 голосов
/ 01 апреля 2017

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

Объект

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

Var

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

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

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

Надеюсь, это кому-нибудь поможет.

Спасибо!

1 голос
/ 06 марта 2018

На простом языке:
Предположим, у нас есть следующий метод:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...