采取以下段:

List<int> distances = new List<int>();

是的冗余旨在通过语言的设计师?如果是这样,为什么?

有帮助吗?

解决方案

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

  1. 名为距离List<int>的变量。
  2. 类型为<=>的堆上的对象。
  3. 请考虑以下事项:

    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))是减少通过简单的类型推导使用 := 声明和初始化结构。

因为我们沉迷于编译器和编译器错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top