Говоря о производительности, что лучше в C #? Использовать динамические типы или приведение типов?
Вот так (просто пример, а не реальная реализация):
var list = new List<object>();
list.Add(new Woman());
list.Add(new Men());
list.Add(new Car());
....... in another code ....
var men = (Men)list[1];
men.SomeMenMethod();
Или это
var list = new List<dynamic>();
list.Add(new Woman());
list.Add(new Men());
list.Add(new Car());
....... in another code ....
var men = list[1];
men.SomeMenMethod();
2 ответа
Если возможно, не используйте ни то, ни другое. Попробуйте использовать типобезопасное решение, не использующее приведение типов или dynamic
.
Если это невозможно, лучше использовать приведение, потому что оно более четкое, более безопасное по типу (компилятор может проверить, что Men
действительно имеет SomeMenMethod
), исключение в случае ошибки более четкое, и оно выиграло не работает случайно (если вы думаете, что у вас есть Men
, но на самом деле у вас есть Woman
, который реализует тот же метод, он работает, но, вероятно, это ошибка).
Вы спросили о производительности. Никто, кроме вас, действительно не может знать результативность вашего конкретного дела. Если вы действительно заботитесь о производительности, всегда измеряйте оба варианта.
Но я ожидаю, что dynamic
будет намного медленнее, потому что он должен использовать что-то вроде мини-компилятора во время выполнения. Он пытается кэшировать результаты после первого запуска, но, скорее всего, он все равно не будет быстрее, чем приведение.
Пример надуманный, поскольку вы знаете, что list [1] - это Men
. Так что в этом случае оба варианта идентичны.
Когда динамический становится полезным, когда вы не знаете точного типа, но знаете, что во время выполнения у него будет SomeMethod
или свойство.
Конечно, если предположение о типе неверно, то первое генерирует исключение для
var men = (Men)list[1];
, в то время как последняя вызывает исключение на men.SomeMenMethod();
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.