Рассмотрим эту тривиальную функцию:
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>
». Но мне интересно, есть ли большая разница между этими подходами, которая ускользает от меня в данный момент.
null
. С другой стороны, при универсальном подходе локальный параметр внутриIsPositive<T>
имеет типT
, который может быть типом значения или ссылочным типом. Имеет ли это смысл? - person Dan Tao   schedule 20.08.2010constrained
, но при компиляции в машинный код ничем не отличается от предыдущего метода упаковки — ничего не выиграешь. - person Mark H   schedule 20.08.2010disasm
в командном окне Visual Studio. - person Mark H   schedule 20.08.2010