var关键字有什么意义?

var关键字不需要明确的types声明,而且我已经感兴趣地阅读了关于何时可能适用的SO讨论 。

我也阅读了(但不是使用) 嘘似乎进一步通过使声明一个局部variables可选 。 随着Boo,types和声明都可以暗示。

这让我想知道,为什么C#语言devise者会麻烦地包含一个var关键字呢?

更新 :是的,var支持匿名types,但匿名types本身并不需要var关键字…

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

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

更新:这里有两个相关的问题,实际上是:1.为什么我必须声明variables? 2.什么使用“VAR”语言,使您声明variables?

(1)的答案很多,可以在其他地方find这个问题。 (2)的答案如下:

正如其他评论者所说,LINQ将其用于匿名types。 然而,LINQ实际上是一个更一般的问题的实例,其中expression式右边的types对于程序员来说是未知的,或者是非常冗长的。 考虑:

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

详细和容易出错,对吗? 所以现在他们让你这样做:

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

通过减less信息的重复,消除了错误。 请注意,这里不仅仅是input错误:左侧expression式的types可能会错误input,编译器可以从左向右静默地投射,但是投射实际上失去了某些属性右值。 当右值返回的types可能是未知的或匿名的时,这一点更为重要。

如果没有var关键字,当你实际上打算使用一个已经存在的variables时,就可能意外地创build一个新的variables。 例如

 name = "fred"; ... Name = "barney"; // whoops! we meant to reuse name 

我了解var的需求,并且它非常好用。 没有关键字,只是在没有types的情况下定义variables是可怕的。 如果您需要重新修改一年以来没有涉及的代码,那么您将伤害下一个必须维护代码的人或者自己。 我不确定这是一个应该在C#中打开的门,我希望它不是因为在不必要的时候var被过度使用而导致可读性问题。

几乎所有最近看到的.net 3.5示例都具有用var定义的所有variables。

我所做的论点是,为了在使用过程中节省键击,它确实牺牲了可读性。 例如:

 // 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(); 

所以下一个争论就是,只要命名function更好…

 var weight = GetExactWeightOfTheBrownYakInKilograms(); 

仍然不知道什么是回来。 它是一个int,小数,浮点数,重量对象,是什么? 我仍然不得不浪费时间去查看它…需要智能拐杖来节省懒惰编程的时间。 也许在函数名中包含返回types。 好主意,现在使用var已经救了我们什么都没有,除了让我所有的function都有真正的长名。

我认为人们刚刚结束使用var,这导致懒惰的编程,反过来导致阅读代码更难。 每当你input关键字var,你应该有一个很好的理由,你为什么使用它,而不是明确的。

在你的问题中, var通过告诉编译器anon这个单词现在是合法的,在你希望看到的作业中隐含的某个types的任何地方使用。 这样就要求编译器引入名称,这样编译器就可以拒绝没有被明确告知的东西,从而在编译时捕获某些types的错误,所以在运行时不会被炸毁。

例如,在你的问题的更新部分,你问了这个片段:

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

允许这种方式的问题是,它将任何分配的左侧的任何名称以前不存在的variables转换为variables声明,即使它是一个真正的拼写错误。 如果在程序的后面你指定了一些其他的东西,然后甚至进一步引用新的值,但中间语句有一个错字,你有一个问题,直到运行时才会显示。

你的回答是,Boo这样做,所以一定是可以的,或者至less可以。 但那是一只红鲱鱼。 我们在谈论C#,而不是Boo。 C#的目的之一是让编译器能够捕获尽可能多的错误。 Boo也想这样做,但它也希望更像Python。 所以它牺牲了一些 (不是全部)C#的编译时安全性来换取类似python的语法。

这有点主观,但我认为deviseC#3.0有隐式typesvariables的“var”关键字而不是没有关键字使代码更具可读性。 例如,下面的第一个代码块比第二个代码块更可读:

显而易见的是声明variables的地方:

 var myVariable = SomeCodeToSetVariableHere; myVariable = SomeOtherCodeTOSetVariable; 

在声明variables的地方不明显:

 myVariable = SomeCodeToSetVariableHere; myVariable = SomeOtherCodeTOSetVariable; 

这些都是过分简单化的例子。 我想你可以看到这个地方。 在复杂情况下,能够findvariables实际定义的位置可能会很好。

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

我投了答案,我觉得是至关重要的(这太容易意外地创build一个新的variables)。

 bill=5; bi11=bill+5 

账单的价值是什么?

也就是说,我觉得有时候会觉得有些恼火:

 DataOutputStream ds=new DataOutputStream(); 

似乎是多余的,但老实说,没有什么不对。 它不需要你再input两遍,这是非常有帮助的。 需要花费时间的是当你有问题时 – 当你不确定如何使用一些API。 如果真的困扰你两次input这种types的声明,那么你为什么在这里浪费你的时间? 自从你开始阅读这篇文章之后,你可以input30或40个声明,足够在接下来的两周内完成每一个声明。

我想说的是,虽然我理解重复自己可能导致的情绪压力,但是制作更加智能的工具的一致性,清晰度和能力使得它值得一试。

还有一件事,大部分代码不应该像我上面的例子。 你应该做的是这样的:

 DataOutput ds=new DataOutputStream(); 

这立即隐藏了一个事实,即你正在使用一个具体的类到模板中。 该模板应该能够完成你所需要的所有操作。 后来,如果你想用其他types的输出stream代替ds,只要改变那一行就可以修复它。 如果您使用DataOutput无法使用的function,则编辑器将很容易找出并通知您。

对于匿名types,除其他外,支持LINQ。

http://www.blackwasp.co.uk/CSharpAnonTypes.aspx

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

var是用于创build匿名types的关键字 – 请参阅http://msdn.microsoft.com/en-us/library/bb397696.aspx

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

var对Linq来说是非常有用的。 事实上,根据一位专家的作者说:“ 如果没有var,LINQ就太痛苦了。 ”

Interesting Posts