Я использовал динамический и тип объекта взаимозаменяемо. Есть ли разница между этими двумя типами? Есть ли какие-либо последствия для использования одного над другим? Какой из них более гибкий?dynamic vs object type
ответ
Это hugely другой.
Если вы используете dynamic
, вы выбираете динамическую типизацию и, таким образом, отказываетесь от проверки времени компиляции по большей части. И да, это менее впечатляюще, чем использование статического ввода , где вы можете использовать статическую типизацию.
Однако в любом случае вы не можете многое сделать с типом object
- у него почти нет членов. Где вы его используете? Когда вы хотите написать код общего назначения, который может работать с различными типами, вы обычно должны рассматривать дженерики, а не object
.
С продвижением в C# языке мы видим, что даже вара типа сравним с динамической и объекта типов. Здесь все 3 типа, как я узнал путем сравнения этих 7 баллов:
Объект
- Объект был введен с C# 1.0.
- Он может хранить любое значение, потому что объект является базовым классом всех типов в .NET framework.
- У компилятора есть небольшая информация о типе.
- Тип объекта может передаваться как аргумент метода, а метод также может возвращать тип объекта.
- Необходимо использовать объектную переменную для оригинального типа для ее использования и выполнения желаемых операций.
- Причина проблемы во время выполнения, если сохраненное значение не преобразуется в базовый тип данных.
- Полезно, если у нас нет дополнительной информации о типе данных.
вар
- вар был введен с C# 3.0
- Он может хранить значения любого типа, но он является обязательным для инициализации типов Var в момент декларации.
- Это безопасный тип, т. Е. Компилятор имеет всю информацию о сохраненном значении, так что он не вызывает никаких проблем во время выполнения.
- Тип Var не может быть передан как аргумент метода, и метод не может вернуть тип объекта. Работа типа Var в области, где она определена.
- Не нужно бросать, потому что у компилятора есть вся информация для выполнения операций.
- Не вызывает проблем, поскольку компилятор имеет всю информацию о сохраненном значении.
- Полезно, если мы не знаем фактического типа типа i.e, является анонимным.
Dynamic
- Dynamic был введен с C# 4.0
- Он может хранить любой тип переменных, подобно старый переменный языка VB.
- Это не безопасный тип i.e. Компилятор не имеет информации о типе переменной.
- Динамический тип может передаваться как аргумент метода, а метод также может возвращать динамический тип.
- Кастинг не требуется, но вам необходимо знать свойства и методы, связанные с сохраненным типом.
- При возникновении неправильных свойств или методов возникает проблема, потому что вся информация о сохраненном значении получает разрешение только во время выполнения.
- Полезно, когда нам нужно кодировать с использованием отражения или динамических языков или с COM-объектами, потому что вам нужно писать меньше кода.
Надеюсь, это поможет кому-то.
Спасибо!
Я понимаю, что var не является типом вообще - он просто неявно решает тип, основанный на инициализированном значении. Например: var x = 2; x НЕ является типом var, это тип int. – Nanomurf
В простом языке:
Предположим Интернета имеет следующий метод:
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();
}
- 1. Общий тип vs dynamic vs object
- 2. Scala dynamic type
- 3. dynamic & object ConstructorInfo.Invoke (object [] parameters)
- 4. JAVA Dynamic List Type
- 5. Flex XML dynamic type
- 6. Dynamic valdr-type
- 7. AngularJs Dynamic Input Type
- 8. Java Dynamic Type How To?
- 9. dynamic vs lazy loading
- 10. Pass MakeGenericMethod a Dynamic Type
- 11. javascript dynamic object
- 12. Dynamic, Object, вар
- 13. reference dynamic Raphael object
- 14. Dynamic Object Creation
- 15. , который рекомендуется: использование static lib vs dynamic lib (shared object)
- 16. Список <Object> vs Список <dynamic>
- 17. JSON to Dynamic Object vs. сильно типизированный объект
- 18. Reflect.Emit Dynamic Type Memory Blowup
- 19. Тип значения Vs Reference Type - Object Class C#
- 20. Deserialize dynamic object in C#
- 21. Javascript null object type
- 22. PHP get_token_all object type
- 23. Realm Results object type
- 24. Json generic object type
- 25. Динамически добавлять свойства `dynamic` type
- 26. SWI-Prolog dynamic/1 vs dynamic/2
- 27. Dynamic vs Dictionary [C#]
- 28. Static vs dynamic sql
- 29. Static vs Dynamic Linking
- 30. Interop.Excel.Range vs dynamic
Если Люк только что назвал несколько методов, доступных в 'System.Object', они также будут называться динамически? –
@Steven: Да, это так - даже для 'GetType', который не является виртуальным! (Вы можете установить делегат для реакции на вызовы GetType на 'ExpandoObject', например. Страшные вещи.) –
Вот чего я боялся. Похоже, нам нужно «вставить» «динамический» путем повышения до «объекта», если мы даже хотим узнать правду о его типе. :-) –