约束与非泛型方法的通用方法

时间:2015-10-12 18:50:21

标签: c# generics

这个问题具体是关于泛型方法(不是类)。

以下两个陈述之间有什么区别?

public bool MyMethod<T>(T t) where T : IMyInterface {}

public bool MyMethod(IMyInterface t) { }

第一个语句定义泛型方法并约束类型,第二个语句是非泛型方法并指定参数的类型。你为什么要用一个呢?

或者,类似的例子:

public class LibraryItem
{
    public string Title;
    public int Stock;
}

public void CheckIn<T>(T item) where T : LibraryItem
{
    item.Stock += 1;
}

public void CheckIn2(LibraryItem item)
{
    item.Stock += 1;
}

同样,使用通用版本优于非通用版本的优势是什么?

2 个答案:

答案 0 :(得分:3)

这种简单约束没有太大区别。

在第一个示例中,如果Tstruct,则非泛型方法将导致装箱。通用方法不需要装箱。

约束不仅限于单个接口,因此有时您无法使用非泛型方法实现相同的功能。

答案 1 :(得分:0)

输出编译的可执行文件可能有所不同,但从编程的角度来看,我看不出2个版本的任何差异:在这两种情况下,你都必须传递一个IMyInterface对象来调用该函数。

除此之外......通用似乎过于复杂,没有任何实际好处。

您知道必须将某些特定的接口类型作为参数处理,不需要泛型。

在框架类List<T>的对面考虑,这是一个只能处理T对象的列表:在这种情况下,泛型就在手边,而使用接口则不会。