-
02-07-2019 - |
题
采取以下段:
List<int> distances = new List<int>();
是的冗余旨在通过语言的设计师?如果是这样,为什么?
解决方案
代码看起来多余的原因是,对于新手程序员来说,它似乎是两次定义相同的东西。但这不是代码正在做的事情。它定义了两个恰好属于同一类型的独立事物。它定义了以下内容:
- 名为距离
List<int>
的变量。 - 类型为<=>的堆上的对象。 醇>
请考虑以下事项:
Person[] coworkers = new Employee[20];
这里非冗余更清晰,因为变量和分配的对象有两种不同的类型(如果对象<!>#8217; s类型派生自或实现变量<!>,则情况合法#! 8217; s type)。
其他提示
什么redudant关于这个?
List<int> listOfInts = new List<int>():
翻译成英文:(编辑,清理了一点澄清)
- 创建一个指的类型清单<int> 和名字listofInts.
- listOfInts现已建立,但它只是一个参照指针指向无处(null)
- 现在,创造一种类型的对象名单<int> 在堆,并返回的指listOfInts.
- 现在listOfInts点列表<int> 在堆。
不是真的详细的当你想它做什么。
当然还有一个选择:
var listOfInts = new List<int>();
在这里我们使用的C#'s型推理,因为你都分配给它立即,C#能不能找出什么类型你想要建立的目的只是建立在堆。
要充分了解如何CLR处理类型,我建议阅读 CLR通过C#.
你总是可以说:
var distances = new List<int>();
正如其他人所说:var
删除了冗余,但它有潜在的负面维护后果。我说它也有潜在的积极的维护后果。
幸运的是,Eric Lippert比我更有说服力地写了这篇文章: http://csharpindepth.com/ViewNote.aspx?NoteID=63 http://csharpindepth.com/ViewNote.aspx?NoteID=61
因为声明类型并不一定与初始化有关。
我可以声明
List<int> foo;
并让它稍后进行初始化。那么冗余在哪里呢?也许它从BuildList()等其他函数接收值。
正如其他人提到的那样,新的var关键字让你可以解决这个问题,但你有在声明时初始化变量,这样编译器就可以知道它是什么类型。
而不是将其视为多余的,请将该构造视为允许您保存一条线的功能。
而不是
列出距离; distance = new List();
c#让你把它们放在一行上。
一行说<!>“我将使用一个名为 distance 的变量,它的类型为List。<!> quot;另一行说<!>“;分配一个新的List并调用无参数构造函数<!>”。
这太多余了吗?也许。这样做会给你一些东西,不过
<强> 1 即可。将变量声明与对象分配分开。允许:
IEnumerable<int> distances = new List<int>();
// or more likely...
IEnumerable<int> distances = GetList();
2. 它允许编译器进行更强大的静态类型检查 - 当声明与赋值不匹配时给出编译器错误,而不是运行时错误。
编写软件是否都需要这些?没有。有很多语言没有这样做,和/或在许多其他方面有所不同。
<!>QUOT;医生!我这样做会很疼!<!> - <!>“不要再那样做了<!>”
如果您发现自己不需要或不想要c#提供的内容,请尝试使用其他语言。即使你不使用它们,了解其他的也可以为你解决问题提供巨大的推动力。如果你确实使用了一个,太棒了!
无论哪种方式,您都可以找到足够的视角来允许自己说<!>;我不需要c#编译器强制执行的严格静态类型检查。我将使用python <!>“;而不是将c#点燃太冗余。
也可以这样做:
var distances = new List<int>();
C#3.0的编译器改进(与.Net 3.5相对应)消除了一些此类事情。所以你的代码现在可以写成:
var distances = new List<int>();
更新的编译器在根据语句中的附加信息计算类型方面要好得多。这意味着您需要为任务指定类型或作为通用的一部分的实例更少。
话虽如此,仍有一些领域可以改进。其中一些是API,有些只是因为强类型的限制。
这种冗余本身并不是故意的,而是所有变量和字段都需要具有类型声明这一事实的副作用。当您考虑到所有对象实例化也在 new 表达式中提及类型的名称时,您会看到冗余的语句。
现在使用 var 关键字进行类型推断,可以消除冗余。编译器很聪明,可以搞清楚。下一个C ++也有一个 auto 关键字,可以做同样的事情。
他们引入 var 的主要原因是匿名类型,没有名称:
var x = new {Foo = Bar, Number = 1};
只有<!>“冗余<!>”;如果您将它与动态类型语言进行比较。它对于多态和在编译时发现错误很有用。此外,它使IDE的代码自动完成/智能感知更容易(如果使用的话)。
静态类型/ C语法的历史工件;比较Ruby示例:
distances = []
在添加功能支持后,C#肯定会变得更加冗长。
如果显而易见的类型是读者,请使用var。
//Use var here
var names = new List<string>();
//but not here
List<string> names = GetNames();
来自microsofts C#编程指南
var关键字也很有用 何时变量的具体类型 在键盘上键入是很乏味的,或者 很明显,或者没有添加到 代码的可读性
你的特定例子确实有点冗长,但在大多数情况下,C#相当精简。
我更喜欢这个(C#)
int i;
到此(VB.NET)
Dim i as Integer
现在,您选择的特定示例是关于.NET的一般情况,这有点偏长,但我不认为这是C#的错。也许问题应该改写<!>“为什么.NET代码如此冗长?<!>
我发现另外一个问题就是使用var来解决懒惰问题
var names = new List<string>();
如果使用var,则名为<!>的变量“; name <!> quot;输入为List<string>,
,但最终只能使用List<T>.
IList<string> = new List<string>();
ICollection<string> = new List<string>();
IEnumerable<string> = new List<string>();
您可以自动使用其中的所有内容,但是您可以考虑在编写代码时要使用的界面吗?
在此示例中,var关键字不会提高可读性。
在许多答复对这个问题,提交人所想像的编译器或辩护士.一个重要的规则的一个良好的编程是 不要重复自己!
避免这些不必要的重复是一个 明确的设计目标 去,例如:
口吃(
foo.Foo* myFoo = new(foo.Foo)
)是减少通过简单的类型推导使用:=
声明和初始化结构。
因为我们沉迷于编译器和编译器错误。