它不错,它更像是一种风格,往往是主观的.当你使用var时,它可以添加不一致性.
这是我对var的主要抱怨.
getter*...,第二个你知道你不必提供任何参数及其返回的内容.您从一开始就知道"该做什么",并且可以在设计或重构时更快地做出决策.手头的所有信息比一些更多的角色更重要.只有在处理大量代码时才能理解这一点. 既然我们都在谈论视觉工作室,那么将鼠标悬停在变量上一秒钟并看到它的类型有什么大不了的?无论如何,要比宣传声明好多了. 9> Kate Gregory..: Var根本不像变种.该变量仍然是强类型的,只是你没有按键来获得它.您可以将鼠标悬停在Visual Studio中以查看其类型.如果您正在阅读打印的代码,那么您可能需要考虑一下才能弄清楚类型是什么.但是只有一行声明它并且许多行使用它,因此给出正确的名称仍然是使代码更容易理解的最佳方式.
使用Intellisense懒惰?打字比整个名字少.或者有些东西工作少但不值得批评?我认为有,而var就是其中之一.
+1,只有人注意`var`与`Variant`无关. 10> Marc Gravell..: 您最需要的时间是匿名类型(需要100%); 但它也避免了重复的微不足道的情况,IMO使线条更清晰.对于简单的初始化,我不需要看两次类型.
例如:
Dictionary>> data = new Dictionary>>();
(请不要编辑上面的hscroll - 它有点证明了这一点!!!)
VS:
var data = new Dictionary>>();
但是,有时这会产生误导,并可能导致错误.var
如果原始变量和初始化类型不相同,请小心使用.例如:
static void DoSomething(IFoo foo) {Console.WriteLine("working happily") }
static void DoSomething(Foo foo) {Console.WriteLine("formatting hard disk...");}
// this working code...
IFoo oldCode = new Foo();
DoSomething(oldCode);
// ...is **very** different to this code
var newCode = new Foo();
DoSomething(newCode);
@Gertjan--我的大脑有限; 如果它很复杂,我**不想**看到它两次并且必须开始比较(接口/具体/等).我很高兴看到它一次,并认为"打字为其中之一". 11> Jon Limjap..: var很难的一个特殊情况:离线代码审查,尤其是在纸上完成的代码审查.
你不能依靠鼠标悬停.
你为什么要在纸上进行代码审查?想想树木!;) 不使用var就可以遇到同样的问题.问题不是var; 问题是变量名称不好.如果变量名称是精心选择的,则使用var无关紧要. 12> Frep D-Orong..: 我看不出有什么大不了的......
var something = someMethod(); // Type of 'something' not clear <-- not to the compiler!
你仍然对'某事'有完整的智能感知,对于任何模棱两可的情况,你有单位测试,对吧?( 你呢? )
它不是varchar,它不是暗淡的,它肯定不是动态或弱打字.它正在停止像这样的maddnes:
List v = new List();
并将整个思维结构减少到:
var v = new List();
很好,不太好:
v = List();
但那就是Boo的用途.
13> Guffa..: 如果有人使用var
关键字,因为他们不想"弄清楚类型",那肯定是错误的原因.在var
不创建一个动态类型的变量关键字,编译器仍然必须知道的类型.由于变量始终具有特定类型,因此如果可能,类型也应在代码中明显.
使用var
关键字的充分理由是例如:
需要的地方,即声明匿名类型的引用.
它使代码更具可读性,即删除重复声明.
写出数据类型通常会使代码更容易理解.它显示了您正在使用的数据类型,因此您不必通过首先确定代码的作用来确定数据类型.
14> Colin Desmon..: 鉴于Intellisense现在有多强大,我不确定var是否比在类中具有成员变量或在可见屏幕区域中定义的方法中的局部变量更难读.
如果你有一行代码如
IDictionary nameDictionary = new Dictionary();
阅读比以下更容易或更难:
var nameDictionary = new Dictionary();
15> Murph..: 我认为VAR的关键是只在适当的时候使用它,即在Linq中做它有助于(也可能在其他情况下)的事情.
如果你有 一个类型的东西你应该使用它 - 不这样做是简单的懒惰(而不是通常被鼓励的创造性懒惰 - 优秀的程序员非常努力懒惰,可以考虑首先是事物的来源).
全面禁止与首先滥用构造一样糟糕,但确实需要一个合理的编码标准.
要记住的另一件事是它不是一个VB类型var,因为它不能改变类型 - 它是 一个强类型变量,只是推断出类型(这就是为什么会有人认为它不是不合理的在一个foreach中使用它,但出于可读性和可维护性的原因,我不同意).
我怀疑这个会运行并运行( - :
墨菲
16> Blorgbeard..: 当然,这int
很容易,但是当变量的类型是IEnumerable>
,var使事情变得更容易.
+1为此.`int`与`var`是争吵的东西,但是多个嵌套的泛型类型使`var`成为天赐之物.这就是反复使用类型名称会破坏代码的可读性的地方. 17> Rostov..: 在CodingHorror这个问题的帖子中被盗:
不幸的是,你和其他人都错了.虽然我同意你的看法,冗余并不是一件好事,但解决这个问题的更好方法就是做以下事情:
MyObject m = new();
或者如果您传递参数:
Person p = new("FirstName","LastName");
在创建新对象的位置,编译器从左侧推断出类型,而不是从右侧推断出类型.这比"var"还有其他优点,因为它也可以用在字段声明中(还有一些其他区域也可以用,但我不会在这里介绍它).
最后,它并不是为了减少冗余.不要误解我的意思,"var"对于匿名类型/投影来说在C#中非常重要,但是这里的使用只是为了解决(我已经说了这么长时间),因为你混淆了正在使用.必须经常输入两次,但是将其声明为零次则太少了.
Nicholas Paldino .NET/C#MVP于2008年6月20日08:00 AM
我想如果你主要担心的是必须输入更少 - 那么就没有任何争论会影响你使用它.
如果你只打算永远 是谁看你的代码的人,那么谁在乎呢?否则,在这种情况下:
var people = Managers.People
没关系,但在这种情况下:
var fc = Factory.Run();
它会使我的大脑从代码的"英语"开始形成任何即时类型的推论.
否则,只需使用您的最佳判断并对可能需要为您的项目工作的其他人进行"礼貌"编程.
上面的示例不是不使用var的参数; 它们是使用良好的描述性变量名称的论据.如果不是[var fc = Factory.Run();]而是[bool fc = Factory.Run();],则代码不会变得更清晰. 18> MartinStettn..: 使用var
而不是显式类型使得重构变得更容易(因此我必须与先前的海报相矛盾,这些海报意味着它没有任何区别,或者它纯粹是"语法糖").
您可以更改方法的返回类型,而无需更改调用此方法的每个文件.想像
...
List SomeMethod() { ... }
...
用的像
...
IList list = obj.SomeMethod();
foreach (MyClass c in list)
System.Console.WriteLine(c.ToString());
...
如果你想重构SomeMethod()
一个IEnumerable
,你就必须foreach
在你使用该方法的每个地方改变变量声明(也在里面).
如果你写
...
var list = obj.SomeMethod();
foreach (var element in list)
System.Console.WriteLine(element.ToString());
...
相反,你不必改变它.
19> erlando..: @aku:一个例子是代码审查.另一个例子是重构场景.
基本上我不想用鼠标打猎.它可能不可用.
有趣的是你说因为var可以使重构更简单.如果您使用过var,则不必使用var.现在您可以始终依赖IDE的重构工具,但是您知道,您也可以始终依赖IDE来实现类型:) 20> Daren Thomas..: 这是一个品味问题.当你习惯了动态类型语言时,所有关于变量类型 的烦恼都会消失.也就是说,如果 你开始喜欢它们(我不确定是否每个人都可以,但我确实如此).
C#var
非常酷,因为它看起来 像动态类型,但实际上是静态 类型 - 编译器强制正确使用.
变量的类型并不那么重要(之前已经说过了).从上下文(它与其他变量和方法的交互)及其名称应该相对清楚 - 不要指望customerList 包含int
...
我还在等着看我的老板对这个问题的看法 - 我有一个"继续"使用3.5中的任何新结构,但我们将如何处理维护?
21> Keith..: 在你IEnumerable
和IEnumerable
它之间的比较你不需要担心 - 如果你传递错误的类型,你的代码无论如何都不会编译.
对于类型安全没有任何顾虑,因为var
它不是 动态的.它只是编译器魔术,你所做的任何类型的不安全的调用都会被捕获.
Var
Linq绝对需要:
var anonEnumeration =
from post in AllPosts()
where post.Date > oldDate
let author = GetAuthor( post.AuthorId )
select new {
PostName = post.Name,
post.Date,
AuthorName = author.Name
};
现在看看intellisense 中的anonEnumeration ,它会出现类似的东西IEnumerable<'a>
foreach( var item in anonEnumeration )
{
//VS knows the type
item.PostName; //you'll get intellisense here
//you still have type safety
item.ItemId; //will throw a compiler exception
}
C#编译器非常聪明 - 如果它们的属性匹配,单独生成的anon类型将具有相同的生成类型.
除此之外,只要你有智能感知,var
在上下文清晰的任何地方使用是很有意义的.
//less typing, this is good
var myList = new List();
//also good - I can't be mistaken on type
var anotherList = GetAllOfSomeItem();
//but not here - probably best to leave single value types declared
var decimalNum = 123.456m;
22> mqp..: 我想这取决于你的观点.我个人从来没有因为var
"误用"而理解一段代码有任何困难,而且我的同事和我全都使用它.(我同意Intellisense在这方面是一个巨大的帮助.)我欢迎它作为一种消除重复性的方法.
毕竟,如果声明如此
var index = 5; // this is supposed to be bad
var firstEligibleObject = FetchSomething(); // oh no what type is it
// i am going to die if i don't know
实际上是不可能处理的,没有人会使用动态类型语言.
相反,如果你现在对"var"感到困惑,我希望你会被"动态"混淆.上帝禁止任何人声明动态然后使用"var"引用它 23> Christian Sp..: 只有在清楚地看到使用什么类型时我才使用var.
例如,在这种情况下我会使用var,因为您可以立即看到x将是"MyClass"类型:
var x = new MyClass();
我不会在这种情况下使用var,因为你必须将鼠标拖过代码并查看工具提示以查看MyFunction返回的类型:
var x = MyClass.MyFunction();
特别是,在右侧甚至不是方法的情况下,我从不 使用var,而只是一个值:
var x = 5;
(因为编译器无法知道我是否需要byte,short,int或者其他)
24> Ryan Lundy..: 对我来说,反感var
表明为什么.NET中的双语是重要的.对于那些也完成了VB .NET的C#程序员来说,其优势var
直观明显.标准C#声明:
List whatever = new List();
在VB .NET中,输入以下内容是等效的:
Dim whatever As List(Of String) = New List(Of String)
但是,在VB .NET中没有人这样做.这将是愚蠢的,因为自.NET的第一个版本以来你已经能够做到这一点......
Dim whatever As New List(Of String)
...创建变量并在一个相当紧凑的行中初始化它.啊,但如果你想要一个IList
,而不是一个List
怎么办?好吧,在VB .NET中,这意味着你必须这样做:
Dim whatever As IList(Of String) = New List(Of String)
就像你必须在C#中做的那样,显然不能var
用于:
IList whatever = new List();
如果你需要 类型不同的东西,它可以.但良好编程的基本原则之一是减少冗余,而这正是var所做的.
25> Neil Hewitt..: 将它用于匿名类型 - 这就是它的用途.其他任何东西都用得太过分了.像很多在C上长大的人一样,我习惯于查看声明类型的左边.除非必须,否则我不会看右边.使用var
任何旧的声明让我一直这样做,我个人觉得不舒服.
那些说"没关系,用你满意的东西"的人并没有看到全局.每个人都会在某个时刻接受其他人的代码,并且必须处理他们在编写代码时做出的任何决定.不得不处理完全不同的命名惯例,或者 - 经典的抱抱式支撑风格,而不是将整个' var
或不是' 添加到组合中.最糟糕的情况是一个程序员不使用的地方var
然后是一个喜欢它的维护者,并使用它扩展代码.所以现在你有一个邪恶的混乱.
标准是一件好事,正是因为它们意味着你更有可能获得随机代码并能够快速完成它.不同的东西越多,越难.转向'var everywhere'风格会产生很大的 不同.
我不介意动态打字,我不介意打印输入 - 用于为他们设计的语言.我非常喜欢Python.但是C#被设计为一种静态明确类型的语言,它应该如何保留.打破匿名类型的规则已经够糟糕了; 让人们更进一步,进一步打破语言的习语,这是我不满意的事情.既然精灵已经不在瓶子里了,它就永远不会再回来了.C#将会变成阵营.不好.
哇.到目前为止忽略了这个主题中提出的所有论点并重新设置整个讨论是一项非常成就的事. 26> BFree..: 很多时候在测试过程中,我发现自己有这样的代码:
var something = myObject.SomeProperty.SomeOtherThing.CallMethod();
Console.WriteLine(something);
现在,有时,我想看看SomeOtherThing本身包含的内容,SomeOtherThing与CallMethod()返回的类型不同.因为我使用var,我只是改变了这个:
var something = myObject.SomeProperty.SomeOtherThing.CallMethod();
对此:
var something = myObject.SomeProperty.SomeOtherThing;
如果没有var,我还必须继续改变左侧的声明类型.我知道它很小,但非常方便.
27> 小智..: 对于想要var
节省时间的afficionados,键入的键击次数更少:
StringBuilder sb = new StringBuilder();
比
var sb = new StringBuilder();
如果你不相信我,请算上他们......
19对21
我会解释是否必须,但只是尝试一下......(取决于你的智能感知的当前状态,你可能需要为每一个输入更多)
对于你能想到的每种类型都是如此!
我的个人感觉是永远不应该使用var,除非类型未知,因为它会降低代码中的识别可读性.识别类型比整行更需要大脑.了解机器代码和位的老定时器确切地知道我在说什么.大脑并行处理,当你使用var时,你强制它序列化它的输入.为什么有人想让他们的大脑更努力?这就是计算机的用途.
28> robi-y..: 我分裂VAR遍布的地方,我唯一值得商榷的地方是内部短路类型,例如我喜欢int i = 3;
过var i = 3;
29> Richard..: 从我昨天写的代码来看,它当然可以简化事情:
var content = new Queue>>();
...
foreach (var entry in content) { ... }
没有,这将是非常冗长的var
.
附录:使用具有真实 类型推断的语言花费一点时间(例如F#)将显示编译器在获得正确类型的表达方面有多好.它当然意味着我倾向于var
尽可能多地使用,现在使用显式类型表明该变量不是初始化表达式的类型.
30> Ignas R..: 没有,除了您不必两次写入类型名称.http://msdn.microsoft.com/en-us/library/bb383973.aspx
31> ShdNx..: 在大多数情况下,输入它只是更简单 - 想象一下
var sb = new StringBuilder();
代替:
StringBuilder sb = new StringBuilder();
有时它是必需的,例如:匿名类型,如.
var stuff = new { Name = "Me", Age = 20 };
我个人喜欢使用它,尽管它使代码的可读性和可维护性降低.
32> krystan hono..: 我以前认为var关键字是一个伟大的发明,但我对它有一个限制
只有在明显类型是什么的情况下才使用var(不滚动或查看返回类型)
我开始意识到这一点然后给了我任何好处并从我的代码中删除了所有var关键字(除非他们是特别需要的),现在我认为它们使代码的可读性降低,特别是对其他人来说,阅读代码.
由于假设类型,它隐藏了意图并且至少在一个实例中导致某些代码中的运行时错误.