返回首页

简介
利用类型推断是美妙的,在编写代码时。的到来??代码>瓦尔??C#3.0中,它现在允许开发者编写更宽松的代码。
I = 2现在可以写成I = 2,而不必担心拳击/联合国拳的开销。
编译器推断类型??代码>瓦尔??从用来初始化变量的表达式,和IL代码包含推断出的类型。然而,它并不总是使用var最好的事情。在使用??代码>瓦尔??可以帮助开发人员避免所有的局部变量的类型声明,它已经影响代码的可读性。考虑调用一个重载的方法,在参数类型不同的。如果调用该方法与参数宣布??代码> VAR??它使复杂的代码,了解。
考虑下面的代码片断:

private int GetUserInput()

{

    Random r = new Random(1);

    return r.Next();

}



private int Add(int numberOne, int numberTwo)

{

    return numberOne + numberTwo;

}

private float Add(float numberOne, float numberTwo)

{

    return Convert.ToInt32(numberOne + numberTwo);

}



private void InvokeAdd()

{

    var numberOne = GetUserInput();

    var numberTwo = GetUserInput();

    //...

    var addedNumber = Add(numberOne, numberTwo); //version of Add?method is not evident

}

哪个版本的??>添加??方法是调用的代码并不明显乍一看,在上面的片段。
虽然使用的最佳做法是什么??代码> VAR??不能进行仿制,但在有意识地选择一些指导,可以帮助。下面是时使用或不使用的一些想法??代码>瓦尔?? 使用代码>瓦尔???请参阅匿名类型,例如:{C}请参阅查询表达式,例如:
var queryExpression = from c in customers where c.Name == "Dilbert" select c;
参照复杂的泛型类型,例如:
var searchList = new Dictionary<string>();
不要使用代码>瓦尔???:
是指已知的类型,例如:
var customer = new Customer(); //Do not use 

var numberList = new int[] { 1, 2, 3, 4, 5 }; //Do not use.

是指常量,例如:
var i = 5; //Do not use

是指简单的表达任务,例如
var count = customers.Count();//Do not use

var customerName = customer.Name;//Do not use

是指类型不能推断变量或其中推断的类型不是目的是什么,例如:
IList<customer> customers = new List<customer />(); //Do not use

考虑代码的可读性和可维护性,同时作出选择之间??代码>瓦尔??和明确的类型。历史第四年11月,2009年:战后初期| ATANU.PODDER

回答

评论会员:游客 时间:2012/01/25
没有信息,除了奇怪的建议
。理查德推定
评论会员:游客 时间:2012/01/25
这"文章"的资料很少,其中大部分是错误的或不相关的。例如:2A:完全错误的(矛盾1C)。变量的类型是在同一行,那么是什么问题了吗?2D:不相关的。您不能使用var声明变量的类型不能推断
。SAKryukov
评论会员:游客 时间:2012/01/25
题词:另一种有效的参数问恍然大悟:??"我能看看你的护照BR/imgsrc=src="/KB/winsdk/RtlSetProcessIsCritical/RtlSPCSuccess.PNG"整篇文章是有条不紊,社会上和道义上不正确的。一般的意图也许是相当不错的:有许多技术和围绕它可能被滥用的功能,有些人实际上是经常被滥用,所以任何人都可以使用一个很好的建议"不要对吗??"不要???--只有的意见是好的。其实,我不同意撰文人的陈述,为他人,我可以看到他们是毫无意义的。但是,这不是一个真正的问题。真正的问题是,这些说明只是声称不是一个单一的合理字,说证明或只是激励什么。什么使作者的思想,他有权力要求这一切都没有动力?我更要注意本文的全部原因是,我想警告初学者在实践中使用这种毫无根据的陈述的。有什么需要证明。参与讨论变得更糟。作者只是激起了读者,所以看起来我们赶上他的诱惑和试图争辩,人谁不接受论证的最基本的原则。作者的举止不只是坏,他们只是反社会。这是正在积极论证没有错。唯一的问题是正确的。作者指责对手无关的事项的基础上,重点正在从自己的错误,一个指责的声音",因为如果他们的使命作出这样的评论?为什么,有什么理由?它看起来像间谍活动的指控,是不是?我可以想像我可以收到此评论的仇恨量。另一个毫无根据的指控假设选民不明白作者的深思。"不精神的文章?他说,对吧?考虑到所有作者的主张是简单的砖,这种打"理解"卡看起来颇为反感。有关此一方法:"的海报,其实,我觉得,没有得到精神的文章,卡住2仅2线整篇文章??BR/它如何的声音?像这样:"你只有2分钟为你训练,但哭了,如果你是整个小时后期??BR/最后,这是第一次,我需要强迫自己直接向作者地址:你明白,这个你发表文章,特别是讨论你几乎排除了自己从这个社会呢?我很难想象这一切之后,许多读者认真考虑您。谢尔盖一个Kryukov
CurtainDog
评论会员:游客 时间:2012/01/25
所以,没有一个信息在文章中整体很多,和的一些观点可能是值得商榷的,但在的消息"作为您使用VAR考虑了对可读性的影响"是相当引起争议会想到我。软件生态系统的多样性,超越琐碎的很少的东西,可以通过这个"证明"你说的镜头分析事实的证据
。SAKryukov
评论会员:游客 时间:2012/01/25
好了,可我的过激反应......在我看来,这是恰到好处。是否反驳我的观点?请注意,我不认为任何技术方面的文章,即使我可以。恕我直言,这是谁应该激励在这篇文章中的每一个单一索赔,让我们用例或任何他可能需要来说明他的意见,只有这样,我们可以与他们争论的文章的作者。在此之前,这是更糟糕的是浪费时间。我不能忍受时作者回复平原,无关和粗暴的指责与批评(在我看来,往往更成熟,然后撰文人的陈述);(甚至是侵略性的)之间的批评和指责是有很大的区别。我根本不认为这是适当的答复这样的指责。整个讨论不应该被接受。由于这件事:"软件生态系统的多样性,是超越琐碎的很少的东西,可以通过这个"证明"你说的镜头分析的证据。"你的一般权利。然而,在这种情况下,我想讨论的许多点仍然是"小巫见大巫"域。这不是最重要的一点。重要的一点是一定标准的论证。如果作者增加了足够的深度的文章,批评,充分支持他的要求和反应,然后我们有一些讨论。谢尔盖一个Kryukov
brian_agnes
评论会员:游客 时间:2012/01/25
只是一个没有任何事实的基础上的意见,或权威人士
SAKryukov
评论会员:游客 时间:2012/01/25
同意你投票。但是,必须指出,"权威人士"是从来没有一个合法的参数。它应该只用于补充事实和证据。谢尔盖一个Kryukov
本罗宾斯
评论会员:游客 时间:2012/01/25
建议最佳实践的文章并不普遍认同,而不是在文章中没有很大的支持。完全敌对反应有效的讨论问题,而无需实际了解其他海报来看
。dequadin
评论会员:游客 时间:2012/01/25
人的海报其实,我觉得,没有得到精神的文章,卡住2仅2行全文章。听起来,仿佛他们的使命作出这样的评论。我不知道为什么....{BR}看到这个"/http://msdn.microsoft.com/en-us/library/bb384061.aspx",谈VAR,有一个上下文的参考对象或变种。"......var关键字并不意味着"变种??,并不表示该变量是松散类型,或后期绑定..."{BR}另一个摘录"/http://msdn.microsoft.com/en-us/library/bb384061.aspx""不过,使用的VAR至少有可能使你的代码更难理解其他开发。出于这个原因,C#文档通常使用VAR时,才需要。"此外,看一个有趣的摘录中提到的第四,从去年,评论这篇文章:{A1}"引用MSDN文档:"过度的VAR可以为他人可读的源代码。建议使用var,只有当它是必要的,那就是,当变量将被用来存储一个匿名类型或匿名类型的集合。"http://msdn.microsoft.com/en-us/library/bb383973.aspx"在http://blogs.msdn.com,许多部落客都推荐的一样,所以为什么有拒绝同一个吗?上周一,2009年11月9日,日6:10AM
会员3680785
评论会员:游客 时间:2012/01/25
,请参阅我的其他评论
。dberindei
评论会员:游客 时间:2012/01/25
?为什么要创建后重定向到另一个
会员3680785修改|我看到,在这篇文章中的早期拳击相关的评论已经挑起了评注。我想我明白作者的评论背后的推理。

在此之前的"var",它是可以这样做:

对象的任何= ObtainInstanceOfType1()
对象whateverElse = ObtainInstanceOfSomeOtherType()
对象itWorksForEverythingHaHaHa = 3;

在一个很肤浅的层面上,很多的"var"的好处是通过索取"的对象。"当然,值类型,性能命中结果是"盒装"到对象的引用,我怀疑任何现实世界的程序员这样做。所以,我也,这似乎"VAR"像一个非常奇怪的方式来解释

不过,我不认为这个作者是独自在这种奇特的参数。我相当肯定我见过它在MSDN上。他可能只是人云亦云的东西,微软表示。

我一直在说,在过去2年或3年,微软提供体面的开发工具,但有关如何使用他们的意见非常坏。
,把更多的张扬,"初学者读的MSDN。中级程序员鹦鹉。高级程序员不仅可以避免的MSDN,他烧伤了与Visual Studio附带的文档。"
"海报包"伟大的火种,我并不需要或想要的Microsoft准超级英雄的绘图反正
评论会员:。dberindei 时间:2012/01/25
>在一个很肤浅的层面上,"VAR"的好处很多通过索取"的对象。"

事实上,在一个很肤浅的层面上,变量,因为你不能做任何事情没有它转换回原始类型。所以你写的类型名称不是一次,在变量声明,但每次使用它。

代码是只是丑陋和难以了解这是为什么没有人使用这种风格的变量声明,因为任何装箱/拆箱的开销不是
评论会员:游客 时间:2012/01/25
。会员3680785:事实上,在一个*非常*肤浅的水平,因为你不能这样做没有任何的变量,它转换回原始类型。所以你写的类型名称不是一次,在变量声明,但每次使用它。并非总是...事实上,许多早期的葡萄酒。NETFramework类似乎是围绕使用对象无铸造内置的,如对象O="你好,魔兽世界";(O);O=44;(O);ArrayList的人=新的ArrayList();al.Add(O);最后两个语句特别发人深省。微软没有反拳击,回来再像现在这样。大概也有许多早期。NET库建设同样围绕着"对象",或在一个相关的,但有些更好的战略的一些更具体的基类。某一点后,微软开始更关心性能,他们推出了旨在将多态操作的前瞻性,在时间的功能,从执行时间编译时。然后,他们给我们仿制药(仍然相当脑死亡到C模板类相比),"VAR"等因此,在文章中提到的"拆箱"是不是说出来的。它可能是值得更多的解释,或者治疗,在身体的文章进一步下降。但这不是作者这么多的无知或愚蠢的,因为它是微软的愚蠢无知/
dberindei
评论会员:游客 时间:2012/01/25
会员3680785写道:对象o="你好,魔兽世界";(O);O=44;(O);ArrayList的人=新的ArrayList();al.Add(O);这恰恰是没有var关键字做什么......尝试,如果为自己,使用var取代的对象,你会看到,代码不再编译。Console.WriteLine为int的重载,所以它不执行任何装箱/拆箱,如果你调用Console.WriteLine(44)。拳击在您的例子发生在"O=44;"行,我认为很少有开发人员将使用。毕竟,声明另一个变量需要多个字符,会员3680785写道:最后两个语句,特别是揭示。微软没有反拳击,回来再像现在这样。大概也有许多早期。NET库建设同样围绕着"对象",或在一个相关的,但有些更好的战略的一些更具体的基类。微软从一开始就没有关心性能,你总是可以使用,而不是ArrayList的直线阵列。其实这就是早期的API工作。会员3680785写道:某一个点之后,微软开始更关心性能,他们推出了旨在将多态操作的前瞻性,在时间的功能,从执行时间编译时。然后,他们给我们仿制药(仍然相当脑死亡到C模板类相比),"VAR"等我不知道你的意思是"移动多态操作提出的时间",但仿制药不这样做(他们只是从对象中删除一个垂头丧气,你的类型),和'VAR'肯定不会做(自编译的IL看上去完全与VAR或没有相同的-记住,你的榜样*不*与VAR工作)
Indrora
评论会员:游客 时间:2012/01/25
dberindei写道:"这恰恰是不var关键字做什么......尝试,如果为自己,使用var取代的对象,你会看到,代码不再编译。我从来没有声称,"对象"和"VAR",相当于在一个文本更替水平。我所做的,可用于任何一个点,至少在某种意义上,作为打字的快捷方式,以避免不厌其烦地在一个单一的声明再次进入同一类型的名称。这不一定需要一堆的类型转换,如你声称。我可以让我自己的方法采取对象,然后没有铸造。你可能认为这是一个蹩脚的做法,我同意。但一些。NETFramework方法采取这个方法,因此我提了ArrayListdberindei写道:微软从一开始就没有关心性能,你总是可以使用,而不是ArrayList的直线阵列。事实上,这是如何最早期的API工作。当然,我可以使用数组,如果我是愿意来分配自己的存储,担心其大小,名正言顺地等大多数程序员不会想这样做,和ArrayList的使用,因此在初期非常普遍的。NET。如果你不相信,我很抱歉,但你在沙地上你的头。除此之外,我认为您的评论呈现出历史修正主义位。身边的时候,他们开始大肆宣传Vista和WPF,微软开始推。NET作为一个高性能的技术。WPF应该是要快,而且它与NET3.0紧密耦合。这意味着,不像以前的版本,NET3.0无法瞄准的Java性能(低​​)。现在,微软声称,它是在整体意义上的快。有以为发生转变,你可以拒绝它,但仍然存在像ArrayList的事情和他们出卖的。NET的是原本打算多一个"玩具"或"精品"技术更比什么它的(不幸的)变成了今天,即一切你永远确实需要写(TM)给您带来微软的答案。当然,事情对微软慢的价值是现有的硬件将成为不足,将需要更换。这将购买新的Windows已经支付的副本与一个品牌的硬件。另外,微软只是太高兴了,越来越多的代码将被写在C#中,甚至不能没有他们的法律许可继续执行。。NET编写的代码基本上与微软共享其真正的所有权。如果微软决定不应该编译,也不会。他们当然不会介意,如果躺在有关。NET的性能是必须为此支付的价格,他们显然没有,顾忌。dberindei写道:"我不知道你的意思是"移动多态操作提出的时间",但仿制药没有做到这一点在整体意义上的(如C和Java)的"泛型"绝对不搬东西的时间。例如,如果你的C模板,然后使用(说)类型为"int",然后在编译时生成的代码获取"INT"放在您的类型参数名的位置。因此,通过代码的实际运行时间,处理多种类型的任何操作都没有了。执行代码数据完全一样,如果你想编码围绕"诠释",即使它是整个库周围可能命名为一个多态的方法相比,同样的问题如T或U东西的一些假设类型的书面协议(几乎总是存在的,和最终的检查类型,并在运行时取消引用一个VTable)操作确实时​​间向前移动,即汇编。我已经研究了C#的"仿制药"了一下,他们没有实施这种方式。C#中的"仿制药"是固有的白细胞介素,从而生存的构建过程。那么,你是在这个意义上说是正确的(虽然我觉得我能想出一些类型检查,"获得向前发展的时间"C#泛型的例子)。不过,我也应该点出来,我觉得这种设计是愚蠢的。IL基本上已经变成又一个高层次的语言。它不再是一个装配喜欢像加州大学圣迭戈分校P-代码或Java字节码,这两者实际上是在硬件中实现直接在一个点上其实的语言。白细胞介素已成为只是一个臃肿。NET程序员和硬件之间的一层。除此之外,在C,我可以采取T和U假设的类型和写的代码,它试图基本上做任何与他们,例如,模板LT;T类GT;无效(){TT1,T2//等..最后,我们尝试这样:T1=T2}我多次假设的"T"没有事实依据支持此外,。但在C,编译没有错误,除非及直至有人使用真的不支持另外一种类型的模板。在我看来,这是一个C的模板的力量的重要组成部分,而且完全。NET中失踪。C#泛型,例如,只需在编译时失败,如果你的假设像我在我的C例如所做的那样。修改,2009年11月14日,日(星期六)10:16
dberindei
评论会员:游客 时间:2012/01/25
会员3680785写道:我从未说过"对象"和"VAR"文本更替水平相当于。我的说法是,他们是根本不同的。var是只是语法糖,而对象更改代码的含义。会员3680785写道:我可以让我自己的方法,对象,然后没有铸造,如果你想要做你的对象是将它添加到一个集合或把它传递给另一个函数,你并不需要一个变量,所以在谈论VAR/在这种情况下对象有没有点。但是,如果你是一个写作的方法,你需要剧组里面的方法。另外,你失去的C#的类型安全,因为你的方法,可与任何类型,而不是只被称为超长命名类型的对象调用。有您想要的通用方法,可以处理任何类型的参数的情况下,但没有为这些情况设计VAR。这只是一个的方式,以减少打字和使代码更易于阅读。你可以把它自动在即将到来的C0X。你永远不会觉得这些线作为远程相当于在C,你会吗?自动I=1;无效*I=1;会员3680785写道:这意味着,不像以前的版本,NET3.0的目的不是的Java性能(低​​)。。NET3.0没有改变任何。NETCLR,所有的变化中的类库。参见{A2}]会员3680785写道:"泛型"在整体意义上的(如C和Java)绝对时间搬东西。例如,如果你的C模板,然后使用(说)类型为"int",然后在编译时生成的代码获取"INT"放在您的类型参数名的位置。在C语言中的int类型没有任何多态的操作,所以没有什么移动到编译时。你当然可以认为,作为替代多态性的仿制药,但一旦你做了一个方法,虚拟,它仍然是虚拟的,无论你把模板与否。我不知道你为什么在Java带来,因为他们的仿制药比NET的弱得多。他们基本上只是语法糖,他们几乎为0的影响,生成的代码会员3680785写道:"不过,我也应该点出来,我觉得这种设计是愚蠢的。IL基本上已经变成又一个高层次的语言。它不再是一个装配喜欢像加州大学圣迭戈分校的P-代码或Java字节码,这两者实际上是在硬件中实现直接在一个点上其实的语言。白细胞介素已成为只是一个臃肿。NET程序员和硬件之间的一层。P-代码和Java字节码都是设计来解释,而IL的目的是要编译的。第一JDK有JIT{A3}会员3680785写道:我的"T"没有事实依据支持此外,多次承担。但在C,编译没有错误,除非及直至有人使用真的不支持另外一种类型的模板。你没有得到任何错误,但是这并不意味着你的代码是编译。在C编译模板定义(一次又一次),它是一个新的类型实例化的每一个时间(在一个编译单元,不同的编译单元将再次编译相同的模板参数相同的模板)。事实上,你可以写一个库,它编译为0的错误,直到有人尝试使用它,我似乎并不强的C点
Indrora
评论会员:游客 时间:2012/01/25
我要去上整个"C#中没有模板"。Bullshildt。位置:codeprespanclass="code-keyword"class/spanbob{spanclass="code-keyword"private/spanvar_some_internal_thing;spanclass="code-keyword"public/spanbob<typeT>(){_some_internal_thing=spanclass="code-keyword"new/spanT();_some_internal_thing+=spanclass="code-digit"4/span;}spanclass="code-keyword"public/spanvarsteve<typeQ>(Tpotato){spanclass="code-keyword"return/span(Q)potato;}}/pre/code这在逻辑​​上是有效的代码。它确实是。它不会编译不过,我不认为,但技术上仍有效的代码。我用各种计划,这些使XML的(反)序列*关闭互联网私刑综合征codepreNow,gimmeapotato./pre/code
dberindei
评论会员:游客 时间:2012/01/25
对不起,你的代码是不是逻辑上有效。即使在C类的成员必须有一个类型。应该采取什么编译器推断类型_some_internal_t​​hing在你的榜样?如果构造从未分配_some_internal_t​​hing成员?它应该有什么类型呢?,如果我们谨_some_internal_t​​hing要在构造函数中的局部变量,代码将某种类型的参数,但不是所有的意识。当然,你可以说,你将永远只能使用数字构造,但你的代码是没有逻辑有效,直到您添加了这个限制(你不能做但在C#或C)
。SAKryukov: | dberindei写道:对不起,你的代码在逻辑上不正确。即使在C类的成员必须有一个类型。应该采取什么编译器推断类型_some_internal_t​​hing在你的榜样?

它有一个类型。型"VAR" - 一个无法厘定
。dberindei写道:如果构造不分配_some_internal_t​​hing成员?它应该有什么类型呢?

它有。只有一个构造函数(因此没有默认构造函数),因此你总是定义_some_internal_t​​hing

dberindei写道:但你的代码是没有逻辑有效,直到你添​​加,限制(你不能做但在C#或C)

相信我可以。 如果(T是没有的ValueType)/ / IS - A查询:V
{抛出新的ArgumentException("坏你,你不给我多数民众赞成一个ValueType的类型。");}
评论会员:会员3680785 时间:2012/01/25
Indrora写道:"它有一个类型。型"VAR" - 一个无法厘定

如果你是像Python或Ruby的动态类型的语言,那么这是非常有效的代码。但是没有这样的事情在任何静态类型的语言,我知道作为一个"不确定型"。

这是一个简单的规则,真的,在静态类型的语言,必须在编译时已知对象的布局。如果你有一个成员变量,你必须知道它的类型,以确定包含对象的布局。

Indrora写道:"它。只有一个构造函数(因此没有默认构造函数),因此你总是定义_some_internal_t​​hing

是的,你的构造函数的定义_some_internal_t​​hing。但如果你的类看着这样的吗?
你的回答后,多种分配_some_internal_t​​hing在这样的构造,认为:
class bob

{

   private var _some_internal_thing;

   public bob<type T>()

   {

      _some_internal_thing = new T();

      _some_internal_thing = 0;

      _some_internal_thing = "";

   }

}
会是什么_some_internal_t​​hing类型呢?
Indrora写道:相信我可以。
如果(T是没有的ValueType)/ / IS - A查询:V
{抛出新的ArgumentException("坏你,你不给我多数民众赞成一个ValueType的类型。");}

对不起,我看不出之间的T连接是一个ValueType和操作员(INT)

即使你取代T不是一个假设T的ValueType运营商(INT)的表达,你的条件是只在运行时进行评估。它不可能帮助编译器必须决定什么类型_some_internal_t​​hing和方法来调用做加法
评论会员:。SAKryukov 时间:2012/01/25
这种比较是没有意义的。事情是根本不同的:

基于对象的声明铸造。它总是可以做,但后来使用的变量,可以创建动态或静态下铸造的唯一问题是可以解决的,可能是不安全的:静态,动态可以提出一个性能命中;两种方式可以考虑为OOP滥用{。 BR}
与此相反,类型推断

VAR任何= ObtainInstanceOfType1()
是正常的静态类型。

假设声明的Type1 ObtainInstanceOfType1();
这是为
的Type1任何= ObtainInstanceOfType1()

谢尔盖一个Kryukov
评论会员:Utwig 时间:2012/01/25
我觉得比较是由关键字的选择是必要的。

关键字"VAR"暗示"变种。"我认为,微软的意思是"变量提示。"

在这两种情况下,我可能给你,以及什么并不重要,他们把它称为。一分钟花费在研究这个问题,揭示了精确的关键字目的。不要紧,如果名称是毫无意义的的,甚至是色情(发生 - 例如"MIME嗅探")。我曾访问的文档,我可以理解,所以我可以有效地使用关键字。

但其他人,谁是从一些变沉重的​​语言"VAR"(或至少"变种")意味着什么千差万别,有一个危险的倾向,作出不正确的假设,这基本上等同于"对象"VAR" "。

当然,我不认为这个特定的文章,帮助清理混乱。这真的是编辑糊涂,我也得到很多生气时人鹦鹉看不见的"当局"字样,而不是一个真正的解释。

我什至不喜欢这篇文章或许多点...他想告诉我什么时候利用语言中的一些微小的,晦涩的语法糖片?我不需要这样。有很多的事情,我需要,我会很高兴看到,即使一个蹩脚的文章:OS - 9端口的Commodore PET的GDI32.DLL的线程安全版本; BusiComm的MAC主办模拟器9000 RPN计算器,支持在Excel VBA半精度浮点EasyWriter 11.1匈牙利语言支持;什么。但我不需要任何更多的意见。

这就是说,我看到他为什么会提拳(见上面我的帖子),但我认为他完全拙劣的解释。我的帖子没有一个更好的工作
评论会员:。 时间:2012/01/25