我一直在学习C#的基础知识,但没有得到一个很好的解释:
var l = new List();
我不知道
它在做什么,或者它List
是否正在做魔术.我也看到过< >
标签中抛出的对象.
有人可以用例子向我解释一下吗?
这是C#的通用语法.
基本概念是它允许您使用Type占位符并在编译时替换实际的实际类型.
例如,旧的方式:
ArrayList foos = new Arraylist(); foos.Add("Test");
通过使ArrayList存储一个System.Objects列表(所有.NET的基本类型).
因此,当从列表中添加或检索对象时,CLR必须将其强制转换为对象,基本上真正发生的是:
foos.Add("Test" as System.Object); string s = foos[1] as String.
这会导致演员的性能下降,而且它也不安全,因为我可以这样做:
ArrayList listOfStrings = new ArrayList(); listOfStrings.Add(1); listOfStrings.Add("Test");
这将编译得很好,即使我在listOfStrings中放入一个整数.
泛型改变了所有这一切,现在使用Generics我可以声明我的集合所期望的类型:
ListlistOfIntegers = new List (); List listOfStrings = new List (); listOfIntegers.add(1); // Compile time error. listOfIntegers.add("test");
这提供了编译时类型的安全性,并避免了昂贵的铸造操作.
尽管存在一些高级边缘情况,但您利用它的方式非常简单.基本概念是通过使用类型占位符使您的类类型不可知,例如,如果我想创建一个通用的"添加两件事"类.
public class Adder{ public T AddTwoThings(T t1, T t2) { return t1 + t2; } } Adder stringAdder = new Adder (); Console.Writeline(stringAdder.AddTwoThings("Test,"123")); Adder intAdder = new Adder (); Console.Writeline(intAdder.AddTwoThings(2,2));
有关泛型的更详细解释,我不能通过C#推荐CLR一书.
这是泛型 - 它是一种类型参数化的形式.在你的例子中,它引用了一个字符串列表 - 列表只会包含字符串:编译器会对它进行处理(相当多),就好像API文档中提到的"T"实际上都是"字符串"一样.因此,您只能向其中添加字符串,如果您使用索引器,则无需转换为字符串等.
说实话,在网上论坛上提供泛型详细报道几乎是不可能的.(在深度的C#中,我花了近50页来讨论泛型.)然而,凭借该功能的名称,您应该处于更好的位置以了解更多信息.MSDN "C#Generics简介"可能是一个很好的起点.
在SO上询问有关泛型的具体问题可能会产生良好的结果 - 我只是不认为它可以在一个问题/答案中真正涵盖.