2010-08-09 2 views
23

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

ответ

35

Это hugely другой.

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

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

+0

Если Люк только что назвал несколько методов, доступных в 'System.Object', они также будут называться динамически? –

+2

@Steven: Да, это так - даже для 'GetType', который не является виртуальным! (Вы можете установить делегат для реакции на вызовы GetType на 'ExpandoObject', например. Страшные вещи.) –

+0

Вот чего я боялся. Похоже, нам нужно «вставить» «динамический» путем повышения до «объекта», если мы даже хотим узнать правду о его типе. :-) –

3

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

Объект

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

вар

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

Dynamic

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

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

Спасибо!

+1

Я понимаю, что var не является типом вообще - он просто неявно решает тип, основанный на инициализированном значении. Например: var x = 2; x НЕ является типом var, это тип int. – Nanomurf

0

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

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); 
    Console.ReadKey(); 
} 

динамический : следующий код компилируется успешно, но если он содержит значение, кроме string, он выдает Runtime err или

public static void Main(string[] args) 
{ 
    dynamic dyn = "String Sample"; 
    ConsoleWrite(dyn); 
    dyn = 1; 
    ConsoleWrite(dyn);// Runtime Error 
    Console.ReadKey(); 
}