是否应将带有值类型的重载方法合并到通用方法中?

时间:2009-12-31 21:14:48

标签: c# generics oop

在执行OO设计时,将使用简单值类型的方法集合合并到泛型方法中会更好吗?例如:

public int Sum(int x, int y)

// Overload with float.
public float Sum(float x, float y)

合并为:

public T Sum<T> (T x, T y)

谢谢,

斯科特

2 个答案:

答案 0 :(得分:3)

一般来说是的,但是,特别是你的例子(总结两个参数) - 你不能用泛型来做,因为+运算符不是你可以约束你的泛型类型的任何接口的一部分论点:)

(注意:这是我的C#部分说话,其他语言可能仍然可能)

答案 1 :(得分:2)

一些案例中,是(并非总是);尽管有相反的谣言,但这是可能的。我为"MiscUtil"(免费等)编写了一些完全的代码,适用于所有类型的代码,包括合适的运算符(甚至是您自己的结构和类,或Nullable<T>等等。)

这里的问题是没有支持Add等的接口,所以在dynamic出现之前(在4.0中)这样做很棘手;但它可以完成 - 这里是usage page,有一个simiplfied Sum(“MiscUtil”中的实际代码稍微复杂一点):

public static T Sum<T>(this IEnumerable<T> source)
{
    T sum = Operator<T>.Zero;
    foreach (T value in source)
    {
        if (value != null)
        {
            sum = Operator.Add(sum, value);
        }
    }
    return sum;
}

同样,在{4.0} dynamic中,很多相对简单,因为它支持运算符;但是,上次我对其进行基准测试时,dynamic比我{ab}使用Expression要慢。

顺便说一下,标准LINQ 可以提供Min / Max的原因是由于IComparable / IComparable<T>,辅以Comparer<T>.Default