Я использовал динамический и тип объекта взаимозаменяемо. Есть ли разница между этими двумя типами? Есть ли какие-либо последствия для использования одного над другим? Какой из них более гибкий?
Динамический тип объекта
Ответ 1
Они сильно отличаются.
Если вы используете dynamic
, вы выбираете динамическую типизацию и, таким образом, отказываетесь от проверки времени компиляции по большей части. И да, это менее результативно, чем использование статической типизации, где вы можете использовать статическую типизацию.
Тем не менее, вы не можете много сделать с типом object
- у него почти нет членов. Где вы его используете? Если вы хотите написать код общего назначения, который может работать с различными типами, вы обычно должны рассматривать общие элементы, а не object
.
Ответ 2
С продвижением на языке С# мы видим, что даже тип var сопоставим с типами динамических и объектов. Вот все три типа, которые я узнал, сравнивая эти 7 пунктов:
Объект
- Объект был введен с С# 1.0.
- Он может хранить любое значение, потому что объект является базовым классом всех типов в .NET framework.
- У компилятора мало информации о типе.
- Тип объекта может передаваться как аргумент метода, а метод также может возвращать тип объекта.
- Необходимо использовать объектную переменную для исходного типа для ее использования и выполнения желаемых операций.
- Причина проблемы во время выполнения, если сохраненное значение не преобразуется в базовый тип данных.
- Полезно, если у нас нет дополнительной информации о типе данных.
Var
- Var был введен с С# 3.0
- Он может хранить любой тип значения, но обязательно необходимо инициализировать типы var во время объявления.
- Это безопасный тип, т.е. компилятор имеет всю информацию о сохраненном значении, так что он не вызывает никаких проблем во время выполнения.
- Тип Var не может передаваться как аргумент метода, и метод не может возвращать тип объекта. Работа типа Var в области, где она определена.
- Не нужно бросать, потому что у компилятора есть вся информация для выполнения операций.
- Не вызывает проблем, поскольку у компилятора есть вся информация о сохраненном значении.
- Полезно, если мы не знаем фактический тип, т.е. тип анонимный.
Динамический
- Динамический был введен с С# 4.0
- Он может хранить любой тип переменной, подобно старой переменной языка VB.
- Это не безопасный тип, т.е. у компилятора нет информации о типе переменной.
- Динамический тип может передаваться как аргумент метода, а метод также может возвращать динамический тип.
- Кастинг не требуется, но вам нужно знать свойства и методы, относящиеся к сохраненному типу.
- При возникновении неправильных свойств или методов возникает проблема, потому что вся информация о сохраненном значении получает разрешение только во время выполнения.
- Полезно, когда нам нужно кодировать с использованием отражения или динамических языков или с COM-объектами, потому что вам нужно писать меньше кода.
Надеюсь, это помогло бы кому-то.
Спасибо!