如果我想创建一个采用实例的方法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 等)?提前致谢。
有几个区别:
- 如果您需要real再次输入(例如传递给另一个通用方法或用于日志记录),那么通用方法会更好
-
T
可能是一个值类型,但最终仍然以通用形式拆箱。这种情况不太可能发生IList
,但对于其他接口来说这是非常合理的
- 通用形式允许您指定具体的实现类型,即不同的从实际的对象类型。例如,您可能传入一个空引用,但仍然想知道哪种实现类型
T
is
- 它们将以不同的方式进行 JIT;参见乔·达菲的最近关于泛型的博客文章 http://www.bluebytesoftware.com/blog/2011/10/23/OnGenericsAndSomeOfTheAssociatedOverheads.aspx了解更多信息
当然,这实际上取决于您在做什么......除非您实际上需要了解任何信息T
在该方法中,通用形式的唯一好处是装箱点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)