请看以下代码段:
Listdistances = new List ();
语言设计者是否打算实现冗余?如果是这样,为什么?
代码看起来多余的原因是,对于新手程序员来说,它似乎是两次定义相同的东西.但这不是代码正在做的事情.它定义了两个恰好属于同一类型的独立事物.它定义了以下内容:
名为distance of type的变量List
.
类型堆上的对象List
.
考虑以下:
Person[] coworkers = new Employee[20];
这里非冗余更清晰,因为变量和分配的对象有两种不同的类型(如果对象的类型派生自或实现变量的类型,那么这种情况是合法的).
什么减少了这个?
ListlistOfInts = new List ():
翻译成英文:(编辑,清理一点澄清)
创建List
listOfInts现在已创建,但它只是一个指向无处的引用指针(null)
现在,在堆上创建一个List
现在listOfInts指向堆上的List
当你想到它的作用时,并不是真的很冗长.
当然还有另一种选择:
var listOfInts = new List();
这里我们使用C#的类型推断,因为你立即分配它,C#可以确定你想要在堆中创建的对象创建什么类型.
要完全理解CLR如何处理类型,我建议阅读CLR Via C#.
你总是可以说:
var distances = new List();
正如其他人所说:var
消除冗余,但它有潜在的负面维护后果.我会说它也有潜在的积极意义维护后果.
幸运的是,Eric Lippert比我更有说服力地写了这篇文章:http ://csharpindepth.com/ViewNote.aspx?注意ID = 63 http://csharpindepth.com/ViewNote.aspx?NoteID=61