我应该*总是*支持在C#3.0中隐含类型的局部变量吗?

Resharper当然这么认为,开箱即用它会唠叨你转换

Dooberry dooberry = new Dooberry(); 

 var dooberry = new Dooberry(); 

这真的被认为是最好的风格吗?

这当然是一种风格问题,但我同意Dare: C#3.0隐式类型声明:要变量还是不变换? 。 我认为使用var而不是显式类型会使代码的可读性降低。在以下代码中:

 var result = GetUserID(); 

结果是什么? 一个int,一个字符串,一个GUID? 是的,这很重要,不,我不应该通过代码来了解。 在代码示例中尤其令人讨厌。

杰夫写了一篇关于此的post,称他赞成var 。 但那家伙太疯狂了!

我看到了stackoverflow成功的模式:挖出旧的CodingHorrorpost和(Jeopardy风格)用问题来表达它们。

我只有在很明显var是什么时才使用它。

对我说清楚:

 XmlNodeList itemList = rssNode.SelectNodes("item"); var rssItems = new RssItem[itemList.Count]; 

我不清楚:

 var itemList = rssNode.SelectNodes("item"); var rssItems = new RssItem[itemList.Count]; 

我看到的答案的最佳总结是Eric Lippert的评论 ,基本上说如果重要的是类型是什么,你应该使用具体类型,但不是以其他方式。 基本类型信息应保留在类型重要的地方。

我公司的标准是在任何地方都使用var,我们在阅读了各种推荐之后来到这里,然后花一些时间来试一试,看看缺少带注释的类型信息是一种帮助还是一种障碍 。 我们觉得这是一个帮助。

人们与之相关的大多数建议(例如Dare的建议)是那些从未尝试使用var而不是具体类型进行编码的人提出的建议。 这使得建议几乎毫无价值,因为它们不是根据经验说话,而是仅仅是推断。

我能给你的最好建议是亲自尝试,看看哪些对你和你的团队有用。

@jongalloway – var不一定会让你的代码更难以理解。

 var myvariable = DateTime.Now DateTime myvariable = DateTime.Now; 

第一个与第二个一样可读,并且需要较少的工作

 var myvariable = ResultFromMethod(); 

在这里,你有一个观点,var可能会使代码的可读性降低。 我喜欢var,因为如果我将小数改为double,我不必在一堆地方改变它(并且不要说重构,有时我会忘记,只是让我变量!)

编辑:刚看完文章,我同意。 大声笑。

我有一种感觉,这将成为Stack Overflow上随着时间推移最受欢迎的问题之一。 归结为偏好。 无论你怎么想都更具可读性。 当在右侧定义类型时,我更喜欢var,因为它更简洁。 当我从方法调用中分配变量时,我使用显式类型声明。

关于这个@Coding Horror有一个很好的讨论

我个人尝试将其使用保持在最低限度,我发现它会损害可读性,尤其是在从方法调用中分配变量时。

像ReSharper这样的工具的一个优点是,您可以随意编写代码,然后将其重新格式化为更易于维护的内容。 我将R#设置为始终重新格式化,以便使用的实际类型是可见的,但是,在编写代码时,我几乎总是键入’var’。

好的工具让你拥有两全其美。

约翰。

只有事先不知道类型才有意义。

“最佳风格”是主观的,并根据具体情况而有所不同。

有时候使用’var’更容易,而不是输入一些非常长的类名,或者如果你不确定给定函数的返回类型。 我发现在使用Linq时,或者在循环声明中使用’var’更多。

其他时候,使用完整的类名更有帮助,因为它比’var’更好地记录代码。

我觉得由开发人员做出决定。 没有银弹。 没有“一个真正的方式”。

干杯!

不是不总是,但我会说很多时间。 类型声明并不比匈牙利表示法有用得多。 你仍然有同样的问题,类型可能会发生变化,并且重构工具有助于它不是理想的,与不必更改指定类型的地方相比,除了在一个地方,不遵循不要重复你自己原理。

可以为变量及其值指定类型名称的任何单行语句都应该使用var,特别是当它是一个很长的Generic ,Dictionary >>

关于这个主题有一篇非常好的MSDN文章 ,它概述了一些你不能使用var的情况:

以下限制适用于隐式类型变量声明:

  • var只能在同一语句中声明和初始化局部变量时使用; 该变量不能初始化为null,也不能初始化为方法组或匿名函数。
  • var不能在类范围的字段上使用。
  • 使用var声明的变量不能在初始化表达式中使用。 换句话说,这个表达式是合法的:int i =(i = 20); 但是这个表达式会产生一个编译时错误:var i =(i = 20);
  • 无法在同一语句中初始化多个隐式类型变量。
  • 如果名为var的类型在范围内,则var关键字将解析为该类型名称,并且不会将其视为隐式类型的局部变量声明的一部分。

我建议检查一下,以了解在代码中使用var的全部含义。

我看到了stackoverflow成功的模式:挖出旧的CodingHorrorpost和(Jeopardy风格)用问题来表达它们。

我恳求无辜! 但你是对的,这似乎是一个相对受欢迎的小问题。