Из того, что я мало понимаю, большинство операций с Generics происходит на уровне IL
, поэтому снижение производительности не сильно, если вообще вообще происходит. Все, что он делает, это заставляет и проверяет объекты определенного типа. Самым большим недостатком является понимание контравариантности и ковариации. Вот несколько статей об этом.
Статья
Использование дисперсии в интерфейсах для общих коллекций
Часто задаваемые вопросы по ковариации и контрастности (обновление .NET 4.0)
Плюсы
С помощью дженериков вы получаете безопасность типов как во время выполнения, так и во время проектирования. Вы можете получать сведения о ваших объектах в режиме реального времени, как если бы они были жестко запрограммированы для определенного типа. Это очень полезно при настройке обоих методов расширения, и ... ну почти во всем остальном. На самом деле, начиная с .NET 2.0, я даже больше не использую неуниверсальные списки для чего-либо, кроме типа object
Как уже отмечали другие, это исключает необходимость распаковки.
Против
Из-за различий в природе противоречивости и ковариации, это может привести к путанице в отношении того, что является и не является приемлемым в родовом в разы. Например, если вы рассмотрите следующий макет ..
interface IBase {
}
class Alpha : IBase {
}
class Beta : Alpha {
}
IList<IBase> ListOfObjects { get; set; }
Это сбивает с толку. Можете ли вы передать в список объекты Alpha
и Beta
? Когда я попробовал, ты не смог. Но потом сработало следующее.
IList<Alpha> ListOfObjects { get; set; }
Он принимает как Alpha
, так и Beta
объекты, потому что Beta
наследует Alpha
Посмотрите больше информации о контравариантности и ковариации здесь . Это очень полезно.
Я никогда не заметил снижения производительности от дженериков. Однако это не означает, что они не существуют. Тем не менее, они просто простые объекты, поэтому я не могу видеть, где будут накладные расходы. В общем, компилятор не должен даже позволять вам запускать код, в котором вы пытаетесь добавить неподходящие объекты в общий список, и если он это делает, то вы где-то допустили ошибку конструктора, или используете dynamics
, или работаете с проблема контравариантности против ковариации. Хотя я понимаю, что кое-что изменилось с .NET 4.0.