一般に、ジェネリッククラスよりも、非ジェネリッククラスにジェネリックメソッドが用意されている方が、使い勝手がよい。
internal class Program
{
public static void Main(string[] args)
{
double d1 = 4;
double d2 = 5;
double max = UtilsByGenericClass<double>.Max(d1, d2);
double min = UtilsByGenericMethod.Min(d1, d2);
}
}
public static class UtilsByGenericClass<T>
{
public static T Max(T left, T right) =>
Comparer<T>.Default.Compare(left, right) < 0 ? right : left;
public static T Min(T left, T right) =>
Comparer<T>.Default.Compare(left, right) < 0 ? left : right;
}
public static class UtilsByGenericMethod
{
public static T Max<T>(T left, T right) =>
Comparer<T>.Default.Compare(left, right) < 0 ? right : left;
public static double Max(double left, double right) =>
Math.Max(left, right);
public static T Min<T>(T left, T right) =>
Comparer<T>.Default.Compare(left, right) < 0 ? left : right;
public static double Min(double left, double right) =>
Math.Min(left, right);
}
上記サンプルでは、UtilsByGenericMethod
の方が、 (1) 呼び出し側での型パラメータの指定が不要 (2) doubleに特化した処理を実装しやすく、かつ、オーバーロードの選択がコンパイラ任せなのでパフォーマンスが良い という点で優れている。
原則として非ジェネリッククラスにジェネリックメソッドを定義し、以下の場合にのみジェネリッククラスを定義すべきである。
(1) 型パラメータにより指定される型の値をクラスが保持する場合(Collection等)
(2) クラスがジェネリックインターフェイスを実装する場合