var关键字不需要明确的类型声明,我已经感兴趣地阅读了SO discussion何时可能适合。
我还阅读了(但未使用过的)Boo,它似乎更进一步,使其成为optional to declare a local variable。使用Boo,可以隐含类型和声明。
这让我想知道,为什么C#语言设计师根本不想包含一个var关键字?
更新:是的,var支持匿名类型,但匿名类型本身不需要var关键字......
var anon = new { Name = "Terry", Age = 34 };
与
anon = new { Name = "Terry", Age = 34 };
答案 0 :(得分:47)
如果没有var关键字,当您实际打算使用现有变量时,可能会意外地创建一个新变量。 e.g。
name = "fred";
...
Name = "barney"; // whoops! we meant to reuse name
答案 1 :(得分:45)
更新:这里有两个相关的问题,实际上: 1.为什么我必须声明变量? 2.在使用声明变量的语言中,“var”有什么用?
(1)的答案很多,可以在其他地方找到这个问题。我对(2)的回答如下:
正如其他评论者所说,LINQ将其用于匿名类型。但是,LINQ实际上是一个更普遍的问题的实例,其中表达式右侧的类型对于程序员来说是未知的,或者是非常冗长的。考虑:
SomeGeneric<VeryLongTypename<NestedTypename>> thing = new
SomeGeneric<VeryLongTypename<NestedTypename>>();
详细且容易出错,对吧?所以现在他们让你这样做:
var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();
通过减少重复信息,消除了错误。请注意,这里不只是输入错误:左手表达式的类型可能被错误输入,编译器可以从左到右默默地进行转换,但转换实际上会失去一些属性。右值。当rvalue返回的类型可能是未知的或匿名时,这一点更为重要。
答案 2 :(得分:39)
我理解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,decimal,float,weight对象,什么?我仍然需要浪费时间来查找它...需要intellisense拐杖来节省我的懒惰编程的一天。也许在函数名中包含返回类型。好主意,现在使用var除了使我的所有函数都具有真正的长名称之外什么都没有保存。
我认为人们刚刚使用var而导致了懒惰的编程,这反过来导致更难以阅读代码。每次输入关键字var时,都应该有充分的理由说明为什么要使用它而不是显式。
答案 3 :(得分:5)
这有点主观,但我认为设计C#3.0以使用隐式类型变量而不是无关键字的“var”关键字使代码更具可读性。例如,下面的第一个代码块比第二个代码块更具可读性:
明确声明变量的位置:
var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
声明变量的位置不明显:
myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
这些是过于简单的例子。我想你可以看到这一点。在复杂的情况下,能够找到实际定义变量的位置可能会很好。
答案 4 :(得分:4)
在您的问题中,var
通过告诉编译器单词anon
现在是合法的,可以在任何您希望看到分配中隐含的类型的项目时使用,从而为代码增加价值。要求在编译器中引入名称允许编译器拒绝未被明确告知的事物,从而在编译时捕获某些类型的错误,这样它们就不会在运行时爆炸。
例如,在您问题的更新部分中,您询问了此代码段:
anon = new { Name = "Terry", Age = 34 };
以这种方式允许它的问题是,它将任何名称以前不存在的赋值的左侧的任何内容转换为变量声明,即使它确实是一个错字。如果稍后在程序中你给anon分配了一些东西,然后再引用新值,但是中间语句有一个错字,你有一个问题,直到运行时才会显示。
你的回答是Boo做到了,所以它必须是好的,或者至少是可能的。但那是一个红鲱鱼。我们谈的是C#,而不是Boo。 C#的目的之一是使用一种语言,编译器可以捕获尽可能多的错误。 Boo也希望这样做,但它也想要更像Python。所以它牺牲了一些(不是全部)C#的编译时安全性来换取类似python的语法。
答案 5 :(得分:1)
我投了一个我认为很关键的答案(很容易意外地创建一个新变量)。
bill=5;
bi11=bill+5
账单的价值是什么?
那就是说,我觉得有时候打字有点恼火:
DataOutputStream ds=new DataOutputStream();
似乎多余,但说实话,它没有任何问题。它不再需要你输入两次,它非常有用。需要时间的是你有什么问题 - 当你不确定如何使用某些API时。如果真的困扰你两次输入那种类型声明,那你为什么要在这里浪费时间?自从你开始阅读本文以来,您可以输入30或40个声明,足以满足您在接下来两周内所需的每个声明。
我想我说的是,尽管我理解重复自己可能导致的情绪压力,但是制作更智能工具的一致性,清晰度和能力使其值得一试。
还有一件事,代码不应该像上面的例子那样。你应该做的是:
DataOutput ds=new DataOutputStream();
这会立即隐藏您将具体类用于模板的事实。该模板应该能够完成您所需的所有操作。稍后如果您想用其他类型的输出流替换ds,只需更改该单行就可以修复它。如果您通过强制转换为DataOutputStream来使用DataOutput不可用的功能,编辑器将很容易理解并告知您。
答案 6 :(得分:0)
有时类型很大。想象一下您在字典中具有通用类型的字典的类型。 var将使此内容更具可读性。 这也是一种编码惯例。
此外,如果您要创建匿名类型,例如var randomData = {Id = 1,name =“ Amit”}
我个人使用类型,因为有时您需要知道函数返回的内容(以防万一,您希望将结果传递给其他函数。)。与将光标悬停在var上相比,查看类型更容易。 例如:var result = GetSomethign();
此外,有时您需要导航到按F12的类型。对于var,这是不可能的。
答案 7 :(得分:-1)
我相信var(以及其他几个新关键字)是专门为了支持Linq而添加的。
var是用于创建匿名类型的关键字 - 请参阅http://msdn.microsoft.com/en-us/library/bb397696.aspx
匿名类型可以在Linq以外的其他地方使用。
var对Linq非常有用。事实上,据一位专家撰写,“Without ‘var’, LINQ gets too painful to use.”
答案 8 :(得分:-1)
对于匿名类型,其中包括支持LINQ。