该变种关键字摒弃了需要一个明确的类型声明,我有兴趣地阅读SO讨论时,它可能是适当的。
我也看到了有关的(但不使用) 嘘 ,这似乎通过使它拿东西了一步可选声明一个局部变量 。 随着嘘,无论是类型和声明可以暗示。
这使我想知道,为什么C#语言的设计者懒得包括var关键字呢?
更新 :是的,VAR支持匿名类型,但匿名类型本身并不必要var关键字...
var anon = new { Name = "Terry", Age = 34 };
与
anon = new { Name = "Terry", Age = 34 };
Answer 1:
更新:有两个相关的问题在这里,实际上是:1。为什么我在所有的声明变量? 2.有什么用“VAR”中,让你声明变量一门语言?
(1)的答案很多,而且可以为其他地方这个问题被发现。 我的答案(2)低于:
正如其他评论者说,LINQ使用此为它的匿名类型。 然而,LINQ实际上是一个更一般的问题,其中一个表达式的右手侧的类型是未知的程序员,或者是非常冗长的一个实例。 考虑:
SomeGeneric<VeryLongTypename<NestedTypename>> thing = new
SomeGeneric<VeryLongTypename<NestedTypename>>();
冗长且容易出错,对吧? 所以,现在他们让你这样做:
var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();
通过减少信息重复,错误被淘汰。 请注意,不只是打字错误,此处有可能为左手表达这样编译器可以悄无声息从左至右投被拼写错误的类型,但中投实际上失去的某些属性右值。 这是更重要的,当由右值返回的类型可能是未知的或匿名的。
Answer 2:
如果没有var关键字就能够意外地创建一个新的变量时,你实际上已打算用已经存在的变量。 例如
name = "fred";
...
Name = "barney"; // whoops! we meant to reuse name
Answer 3:
我明白var的需要,它提供它的目的很大。 没有关键字,只是定义上,没有类型苍蝇变量是可怕的。 你伤害了未来的家伙谁拥有,如果你需要返工您还没有超过一年,相触在代码保持你的代码或自己。 我不知道是应该在C#中打开一扇门,我希望它是不能作为变量已经造成可读性问题被过度使用时,当它是没有必要的。
几乎每一个.NET 3.5的例子中,我看到最近有VAR定义的所有变量。
我所做的arguement是,它真的牺牲可读性保存击键时,在使用它的缘故。 例如:
// 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();
所以接下来arguement会,只是名称的功能更好的...
var weight = GetExactWeightOfTheBrownYakInKilograms();
还是不知道什么是回来了。 它是一个整数,小数,浮点数,配重物,是什么? 我还是要浪费时间寻找它...需要智能感知拐杖从我的惰性编程败局。 也许包括函数名返回类型。 好主意,现在用VAR救了我们什么都不做,除了我,所有功能都真正的长名字。
我认为人们只是在使用VAR和它在导致惰性编程这又导致难以阅读的代码。 你输入了关键字var每次,你应该有你为什么使用它,而不是被明确的一个很好的理由。
Answer 4:
这是一个有点主观的,但我认为设计C#3.0对隐式类型变量而不是没有关键字“VAR”关键字使代码更易读。 例如,第一代码块下方比第二更易读:
明显对变量的声明:
var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
不明显对变量的声明:
myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
这些都是过于简单的例子。 我想你可以看到这个去。 在复杂的情况下,它可能是不错的能够找到变量在哪里实际上定义的地方。
Answer 5:
在你的问题, var
告诉编译器这个词增加价值,代码anon
现在是合法使用的任何地方,你希望看到在分配隐含的类型的项目。 需要引进名编译器像这样拒绝的东西还没有被明确告知是允许的,并因此在编译时捕获某些类型的错误,使他们不会在运行时炸毁编译器。
例如,在你的问题的更新部分,您问这个片段:
anon = new { Name = "Terry", Age = 34 };
以允许它这样的问题是,它打开其中名称先前不存在成变量声明任何任务的左侧任何东西,即使它是一个真正的错字。 如果在后面的程序你参考进一步分配给匿名别的东西,然后新的价值,但中间声明有一个错字,你就不会显示,直到运行时的一个问题。
你的回应是嘘声这样做,所以它必须是正确的,或者至少是可能的。 但是,这是一个红鲱鱼。 我们谈论的是C#,而不是嘘声。 一个C#的目的是有一个语言编译器在哪里可以捕捉尽可能多的错误越好。 嘘要做到这一点,太,但同时也希望更多像Python。 因此,它牺牲了一些 (不是全部)的C#编译时的安全性,以换取蟒蛇的语法。
Answer 6:
免责声明:我的例子是Java,因为这是我所知道的,但其概念应该是相同的。
我投了,我觉得是至关重要的(它太容易不小心创建一个新的变量)的答案。
bill=5;
bi11=bill+5
什么是票据的价值?
这就是说,我觉得有些刺激,有时键入:
DataOutputStream ds=new DataOutputStream();
似乎是多余的,但说实话没有什么真的错了吧。 它并不需要你的任何更长的时间来输入两次,这是极有帮助。 如果您有什么问题需要时间 - 当你不知道只是如何使用一些API。 如果它真的困扰你键入的类型声明两次,那么你为什么浪费你的时间吗? 既然你开始阅读,你可以键入30或40的声明,足以让每一个你需要在未来两周内宣布。
我想我说,虽然我知道情绪紧张,如果重复自己可以引起,一致性,清晰度和做出更智能的工具的能力,使其非常值得的。
还有一两件事,大部分时间的代码不应该像我上面的例子。 什么,你应该做的是这样的:
DataOutput ds=new DataOutputStream();
这立即隐藏您正在使用的具体类为模板的事实。 该模板应该可以做你需要在你的类中的所有操作。 以后,如果你想与一些其他类型的输出流来代替DS,简单地改变这种单一的生产线将解决这个问题。 如果你使用不可用的DataOutput功能通过转换成DataOutputStream类,编辑器会很容易弄清楚,让你知道。
Answer 7:
对于匿名类型,除其他事项外支持LINQ。
http://www.blackwasp.co.uk/CSharpAnonTypes.aspx
Answer 8:
我相信,VAR(和其他几个新的关键字)是专门加入到支持LINQ的。
VAR是用于创建匿名类型的关键字-见http://msdn.microsoft.com/en-us/library/bb397696.aspx
匿名类型可以在其他地方比LINQ的使用。
VAR是exceedingy有用的LINQ。 事实上,根据一个专家撰文,“ 如果没有‘变种’,LINQ变得太痛苦的使用。 ”
文章来源: What's the point of the var keyword?