c#-var关键字有什么意义?

var关键字消除了对显式类型声明的需要,并且我很感兴趣地阅读了SO何时合适的讨论。

我还读过(但未使用过)Boo,它似乎通过将其声明为局部变量而成为可选项。 使用Boo,可以隐含类型和声明。

这使我想知道,为什么C#语言设计人员根本不愿意包含var关键字?

更新:是的,var支持匿名类型,但是匿名类型本身不需要var关键字...

var anon = new { Name = "Terry", Age = 34 };

anon = new { Name = "Terry", Age = 34 };
Ed Guiness asked 2020-02-29T16:24:07Z
8个解决方案
47 votes

如果没有var关键字,当您实际上打算使用已经存在的变量时,可能会意外地创建一个新变量。 例如

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name
Ferruccio answered 2020-02-29T16:30:30Z
45 votes

更新:这里实际上有两个相关的问题:1.为什么我必须声明所有变量?2.“ var”在使您声明变量的语言中有什么用?

(1)的答案很多,可以在该问题的其他地方找到。 我对(2)的回答如下:

正如其他评论者所说,LINQ将其用于匿名类型。 但是,LINQ实际上是一个更普遍的问题的实例,其中表达式右侧的类型对于程序员来说是未知的,或者是非常冗长的。 考虑:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

详细且容易出错,对吗? 所以现在他们让您做到这一点:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

通过减少信息重复,消除了错误。 请注意,这里不仅仅是输入错误:左侧表达式的类型可能会被错误键入,从而使编译器可以从左向右静默转换,但是转换实际上会丢失 右值。 当右值返回的类型可能是未知或匿名时,这一点尤为重要。

JSBձոգչ answered 2020-02-29T16:30:09Z
40 votes

我了解对var的需求,并且它的用途非常重要。 没有关键字,只是在没有类型的情况下即时定义变量是很恐怖的。 如果您需要重新处理一年多来没有碰到的代码,您会伤害下一个必须维护您的代码的人,或者您自己。 我不确定这是否应该在C#中打开,我希望它不是,因为var在不必要时过度使用时已经引起了可读性问题。

我最近看到的几乎每个.net 3.5示例都具有用var定义的所有变量。

我提出的论点是,为了节省过度使用时的击键次数,它确实牺牲了可读性。 例如:

// What myVar is, is obvious
SomeObject myVar = new SomeObject();

// What myVar is, is obvious here as well
var myVar = new SomeObject();

我看到的问题是人们到处都在使用它……例如:

// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();

因此,下一个参数将是,只需对函数命名更好...

var weight = GetExactWeightOfTheBrownYakInKilograms();

仍然不知道会回来什么。 是int,十进制,float,weight对象吗? 我仍然不得不浪费时间查找它……需要智能感知拐杖来从懒惰的编程中节省一天的时间。 也许在函数名称中包含返回类型。 好主意,现在使用var除了使我的所有函数都具有真实的长名称之外,没有为我们节省任何费用。

我认为人们刚刚结束使用var,这导致了懒惰的编程,这反过来又导致难以阅读代码。 每次键入关键字var时,应该有充分的理由说明为什么要使用它而不是明确使用它。

Kelsey answered 2020-02-29T16:31:18Z
6 votes

这有点主观,但我认为将C#3.0设计为对隐式类型的变量使用“ var”关键字而不是无关键字会使代码更具可读性。 例如,下面的第一个代码块比第二个代码块更具可读性:

在声明变量的地方很明显:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

声明变量的位置不明显:

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

这些都是过于简单的例子。 我认为您可以看到进展。 在复杂的情况下,最好能够找到实际定义变量的位置。

Jason Jackson answered 2020-02-29T16:31:52Z
4 votes

在您的问题中,var通过告诉编译器anon这个词现在可以在您希望看到任务中隐含的类型的任何地方使用了,从而为代码增加了价值。 要求像这样向编译器引入名称,可以使编译器拒绝未明确告知的内容,从而在编译时捕获某些类型的错误,因此它们不会在运行时崩溃。

例如,在问题的更新部分,您询问了以下片段:

anon = new { Name = "Terry", Age = 34 };

允许这种方式的问题是,它将名称之前不存在的任何赋值左侧的任何内容转换为变量声明,即使这确实是一个错字。 如果稍后在程序中将其他内容分配给anon,然后甚至进一步引用新值,但是中间语句有错字,则您将遇到一个问题,直到运行时才会出现。

您的回应是Boo做到了,因此一定可以或至少可以做到。 但这是一条红鲱鱼。 我们在谈论的是C#,而不是Boo。 C#的目的之一是拥有一种语言,使编译器可以捕获尽可能多的错误。 Boo也想这样做,但也希望更像Python。 因此,它牺牲了C#的部分(并非全部)编译时安全性来换取类似python的语法。

Joel Coehoorn answered 2020-02-29T16:32:27Z
2 votes

免责声明:我的示例是Java,因为这是我所知道的,但是概念应该相同。

我对我认为很关键的答案投了赞成票(很容易意外地创建新变量)。

bill=5;
bi11=bill+5

票据的价值是多少?

就是说,我发现有时键入有些烦人:

DataOutputStream ds=new DataOutputStream();

似乎是多余的,但说实话,它并没有真正的错。 不需要您再键入两次,这将非常有用。 当您不确定如何使用某些API时,需要花费时间。 如果确实打扰您两次键入该类型声明,那么为什么要在这里浪费时间呢? 自从您开始阅读本文以来,您可能已经输入了30或40条声明,足以满足接下来两周所需的每条声明。

我想我想说的是,尽管我了解重复自己可能造成的情绪压力,但是一致性,清晰度和制作更智能工具的能力使它值得。

还有一件事,大多数时候代码不应该像上面的例子那样。 您应该做的是这样的:

DataOutput ds=new DataOutputStream();

这立即隐藏了您在模板中使用具体类的事实。 该模板应该能够完成您在课堂上所需的所有操作。 以后,如果您想用其他类型的输出流替换ds,只需更改该行即可解决。 如果通过强制转换为DataOutputStream使用了DataOutput不可用的功能,则编辑器将轻松找出并告知您。

Bill K answered 2020-02-29T16:39:56Z
-1 votes

对于匿名类型,它尤其支持LINQ。

[HTTP://呜呜呜.black问asp.co.UK/C sharp anon types.aspx]

BlackWasp answered 2020-02-29T16:40:21Z
-1 votes

我相信专门添加了var(和其他几个新关键字)来支持Linq。

var是用于创建匿名类型的关键字-请参见[http://msdn.microsoft.com/zh-cn/library/bb397696.aspx]

匿名类型可以在Linq之外的其他地方使用。

var对于Linq非常有用。 实际上,根据一位专家作者的说法,“如果没有'var',LINQ将变得非常痛苦,无法使用。”

DOK answered 2020-02-29T16:40:55Z
translate from https://stackoverflow.com:/questions/209199/whats-the-point-of-the-var-keyword