C # - динамический тип или Typecast? - PullRequest
0 голосов
/ 28 августа 2011

Говоря о производительности, что лучше в C #?Использовать динамические типы или Typecast?

Вот так (просто пример, а не реальная реализация):

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 ]

1 голос
/ 28 августа 2011

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

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

Конечно, если предположение типа неверно, то первое выдает исключение на

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

0 голосов
/ 28 августа 2011

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

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

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

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

...