Говоря о производительности, что лучше в 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();
0
walteram 28 Авг 2011 в 04:46

2 ответа

Лучший ответ

Если возможно, не используйте ни то, ни другое. Попробуйте использовать типобезопасное решение, не использующее приведение типов или dynamic.

Если это невозможно, лучше использовать приведение, потому что оно более четкое, более безопасное по типу (компилятор может проверить, что Men действительно имеет SomeMenMethod), исключение в случае ошибки более четкое, и оно выиграло не работает случайно (если вы думаете, что у вас есть Men, но на самом деле у вас есть Woman, который реализует тот же метод, он работает, но, вероятно, это ошибка).

Вы спросили о производительности. Никто, кроме вас, действительно не может знать результативность вашего конкретного дела. Если вы действительно заботитесь о производительности, всегда измеряйте оба варианта.

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

0
svick 28 Авг 2011 в 14:41

Пример надуманный, поскольку вы знаете, что list [1] - это Men. Так что в этом случае оба варианта идентичны.

Когда динамический становится полезным, когда вы не знаете точного типа, но знаете, что во время выполнения у него будет SomeMethod или свойство.

Конечно, если предположение о типе неверно, то первое генерирует исключение для

var men = (Men)list[1];, в то время как последняя вызывает исключение на men.SomeMenMethod();

1
Preet Sangha 28 Авг 2011 в 00:50