Рассмотрим эту тривиальную функцию:
public static bool IsPositive(IComparable<int> value)
{
return value.CompareTo(0) > 0;
}
Теперь, если я передам int
этому методу, он будет упакован.Не лучше ли было бы поэтому определить вышеописанный метод следующим образом?
public static bool IsPositive<T>(T value) where T : IComparable<int>
{
return value.CompareTo(0) > 0;
}
Используя общее ограничение таким образом, я могу достичь точно такой же функциональности, как и код выше, с дополнительным преимуществом, что нетнеобходим бокс (поскольку вызов IsPositive<int>
принимает параметр типа int
).
Приведенный выше пример кода явно совершенно бессмыслен.Но мой более широкий вопрос: не так ли всегда имеет смысл определять методы последним способом (используя общее ограничение, а не параметр какого-либо типа интерфейса), чтобы избежать потенциальной блокировкитипов значений?
Я подозреваю, что ответ, скорее всего, будет "да", но он требует большего набора текста, и во многих случаях встреча с типом значения будет очень маловероятной, например, когда метод принимает некоторыеIEnumerable<T>
«.Но мне интересно, есть ли большая разница между этими подходами, которые ускользают от меня в данный момент.