[英]Difference between interface as type constraint and interface as parameter?
如果我想创建一个将IList
实例作为参数(或任何其他接口,但让我们使用IList
作为示例)的方法,我可以创建一个带有类型约束的泛型方法,例如:
public static void Foo1<T>(T list) where T : IList
{
}
或者,我可以创建一个直接获取IList
参数的方法:
public static void Foo2(IList list)
{
}
对于所有意图和目的,似乎这些方法的行为完全相同:
List<string> myList = new List<string>();
Foo1(myList);
Foo2(myList);
所以这是我的问题 - 这两种方法之间的区别是什么? 似乎第二种方法更具可读性; 我应该注意哪些其他差异(生成不同的IL等)? 提前致谢。
如果Foo2返回void,则无关紧要。 但是假设Foo2返回了列表的修改版本。 使用IList参数,它能做的最好就是返回另一个IList。 但是使用IList约束,它可以返回调用者想要的任何类型,假设该类型实现了IList
除了所有较低级别的含义之外,当列表被封装并且有修改它的操作时,你谈论的是一个对象而且这个列表不应该暴露(在大多数情况下),因此使用泛型是没有意义的并且在没有正当理由的情况下揭露该类的内部运作。
如果您有一个需要公开列表的数据结构,那么通过泛型指定它往往会使数据存在更容易阅读(恕我直言)。
重复你的例子我更喜欢第二种方法。 当调用者可以使用多个类型时,通常使用通用方法或类,如示例中所示。 在这种情况下,您可以避免基类(例如object
)作为返回值并提供类型安全返回值。 简单的样本
public class Foo<T>
{
public T GetSomething()
{
return default(T);
}
}
简单:
在这里你给出了一个非常简单的例子:因为你已经给了顶级接口ILIST。
但是,
让我说我有一个对象的instanc。
JimMorrison
JohnLennon
SnowieWhite
他们都来自ILegends
。
他们都是歌手的对象(var singer = new Singer())
YokOno
也是一名歌手,但不是 Ilegends
(mmmm ......不知道为什么?)
而你的功能可以采取Singer
。
但是你想确保只有ILegeneds才有效......所以这是你的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.