C#中的冗余?

Est*_*aya 12 .net c# generics programming-languages

请看以下代码段:

List<int> distances = new List<int>();
Run Code Online (Sandbox Code Playgroud)

语言设计者是否打算实现冗余?如果是这样,为什么?

Jef*_*dge 74

代码看起来多余的原因是,对于新手程序员来说,它似乎是两次定义相同的东西.但这不是代码正在做的事情.它定义了两个恰好属于同一类型的独立事物.它定义了以下内容:

  1. 名为distance of type的变量List<int>.
  2. 类型堆上的对象List<int>.

考虑以下:

Person[] coworkers = new Employee[20];
Run Code Online (Sandbox Code Playgroud)

这里非冗余更清晰,因为变量和分配的对象有两种不同的类型(如果对象的类型派生自或实现变量的类型,那么这种情况是合法的).


Fly*_*wat 15

什么减少了这个?

List<int> listOfInts = new List<int>():
Run Code Online (Sandbox Code Playgroud)

翻译成英文:(编辑,清理一点澄清)

  • 创建List <int>类型的指针并将其命名为listofInts.
  • listOfInts现在已创建,但它只是一个指向无处的引用指针(null)
  • 现在,在堆上创建一个List <int>类型的对象,并将指针返回给listOfInts.
  • 现在listOfInts指向堆上的List <int>.

当你想到它的作用时,并不是真的很冗长.

当然还有另一种选择:

var listOfInts = new List<int>();
Run Code Online (Sandbox Code Playgroud)

这里我们使用C#的类型推断,因为你立即分配它,C#可以确定你想要在堆中创建的对象创建什么类型.

要完全理解CLR如何处理类型,我建议阅读CLR Via C#.


Nes*_*cio 10

你总是可以说:

 var distances = new List<int>();
Run Code Online (Sandbox Code Playgroud)

  • 利用类型推断并不是懒惰. (9认同)
  • 在这种情况下我总是会使用var!从呼叫站点的上下文中可以清楚地看到对象的类型.但是,在调用返回相同类型的函数时,我会避免使用var,因为读取器并不总是清楚返回值. (6认同)
  • 你可以,但你不应该!var关键字是为设计人员不知道返回的类型而编译器的情况设计的 - 就像linq中的动态类型一样.它不是为懒惰程序员设计的. (2认同)
  • 或者,接受类型推断.这是一个功能,它可供您使用.至少,所有*其他*语言的体育类型推断就是这种情况.此外,linq没有"动态类型".它包含一个名为"编译器生成的静态匿名类型"的非linq特性. (2认同)

Jon*_*eet 9

正如其他人所说:var消除冗余,但它有潜在的负面维护后果.我会说它也有潜在的积极意义维护后果.

幸运的是,Eric Lippert比我更有说服力地写了这篇文章:http ://csharpindepth.com/ViewNote.aspx?注意ID = 63 http://csharpindepth.com/ViewNote.aspx?NoteID=61