C# 3.0 邪恶的';var';在C#中?

C# 3.0 邪恶的';var';在C#中?,c#-3.0,anonymous-types,C# 3.0,Anonymous Types,可能重复: 编辑: 对于那些仍在看这篇文章的人,我完全改变了我对var的看法。我认为这主要是因为我对这个话题的回应。我现在是一个狂热的“var”用户,我认为它的支持者在几乎所有情况下的评论都是绝对正确的。我认为我最喜欢var的一点是它确实减少了重复(符合DRY),并使代码更加干净。它支持重构(当您需要更改某个对象的返回类型时,您需要处理的代码清理更少,而且不,不是每个人都有一个奇特的重构工具!),而且有趣的是,如果不事先知道某个变量的特定类型,人们似乎不会有什么问题(很容易“发现”按需类型的功

可能重复:

编辑: 对于那些仍在看这篇文章的人,我完全改变了我对var的看法。我认为这主要是因为我对这个话题的回应。我现在是一个狂热的“var”用户,我认为它的支持者在几乎所有情况下的评论都是绝对正确的。我认为我最喜欢var的一点是它确实减少了重复(符合DRY),并使代码更加干净。它支持重构(当您需要更改某个对象的返回类型时,您需要处理的代码清理更少,而且不,不是每个人都有一个奇特的重构工具!),而且有趣的是,如果不事先知道某个变量的特定类型,人们似乎不会有什么问题(很容易“发现”按需类型的功能,这通常是必需的,即使您知道类型的名称。)

下面是对“var”关键字的热烈掌声


这是一个相对简单的问题…更多的是民意调查。我是C#的超级粉丝,自从.NET首次发布以来,我已经使用它超过8年了。我是该语言所有改进的粉丝,包括lambda表达式、扩展方法、LINQ和匿名类型。然而,我觉得C#3.0中有一个功能被严重滥用了,“'var'关键字”

自从C#3.0发布以来,在博客、论坛甚至Stackoverflow上,我看到var几乎替换了所有已经编写的变量!对我来说,这是对该特性的严重误用,并导致非常任意的代码,由于不清楚变量的实际类型,这些代码可能有许多模糊的bug

“var”只有一个真正有效的用法(至少在我看来)。你问,这有什么用?唯一有效的用途是当您无法了解类型时,以及唯一可能发生这种情况的情况:

访问匿名类型时

匿名类型没有编译时标识,因此var是唯一的选项。这是添加var以支持匿名类型的唯一原因

那么…你的看法是什么?鉴于var在博客、论坛、ReSharper等工具的建议/实施上的大量使用,许多后起之秀的开发人员将其视为完全有效的东西

  • 你认为var应该被大量使用吗
  • 除了匿名类型之外,您认为var还应该用于任何其他用途吗
  • 在博客上发布的代码中使用以保持简洁性是可以接受的吗?(我自己也不确定这个问题的答案……也许有一个免责声明)
  • 作为一个社区,我们应该鼓励更好地使用强类型变量来提高代码的清晰度,还是让C#变得更模糊、更不具描述性

我想知道社区的意见。我看到var使用了很多,但我不知道为什么,也许有一个很好的理由(即简洁/简洁)。我认为它应该在同一语句中其他地方明确指定类型的情况下使用:

Dictionary myHashMap=newdictionary();
阅读是一种痛苦。这可以用以下内容代替,且不失清晰:

var myHashMap = new Dictionary<string, List<int>>();
var myHashMap=newdictionary();

永远不要说不。我很确定有很多问题,人们已经阐述了他们对
var
的看法,但这里是我的问题

var
是一种工具;在合适的地方使用,不合适的时候不要使用。您是对的,
var
的唯一必要使用是在寻址匿名类型时,在这种情况下,您没有可使用的类型名称。就我个人而言,我认为任何其他用途都必须考虑可读性和惰性;特别是在避免使用繁琐的类型名时

var i = 5;
(懒惰)


(有问题的话,我认为它是可接受的,如果且仅当GETCuuleServer()返回HeqKell上的iQuaby)

读取。它是一种静态类型的语言,在这种语言中,您很少需要声明任何内容的类型。因此,它使用与var相同的方法,作为标准的“惯用”编码风格

如果编译器可以为您找出一些东西,为什么要编写相同的东西两次呢


我的一位同事起初和你一样非常反对var,但现在已经开始习惯性地使用它。他担心这会减少程序的自文档化,但实际上这更多是由过长的方法造成的。

正如Earwicker所指出的,有一些函数式语言,Haskell是一种,F#是另一种,在更普遍地使用这种类型推断的情况下——C#类比将方法的返回类型和参数类型声明为“var”,然后让编译器为您推断静态类型。静态类型和显式类型是两个相互正交的问题


事实上,说“var”的使用是动态类型是正确的吗?据我所知,这就是C#4.0中新的“动态”关键字的用途。“var”用于静态类型推断。如果我错了,请纠正我。

如果您觉得两次提供相同的信息可以减少错误(许多web表单的设计者坚持您两次键入电子邮件地址,他们似乎同意),那么您可能会讨厌var。如果您编写了大量使用复杂类型规范的代码,那么这就是天赐良机

编辑:举例说明一下(万一听起来我不赞成var):

在英国(至少在我去的时候),让计算机科学专业的学生学习如何用标准ML编程是标准做法。与其他函数式语言一样,它有一个类型系统,使C++/Java模式中的语言相形见绌

无论如何,我当时注意到(也听到其他学生的类似评论)让SML程序编译是一场噩梦,因为编译器对SML程序的要求越来越苛刻
var i = 5;
var list = new List<Customer>();
var customers = GetCustomers();
var Foo = new string[]{"abc","123","yoda"};
var Bar = {"abc","123","yoda"};
var MyCustomers = from c in Customers 
                  where c.City="Madrid" 
                  select new { c.Company, c.Mail };
VeryComplicatedType x = new VeryComplicatedType();