我应该*总是*支持C#3.0中隐式输入的局部变量吗?

时间:2008-08-19 21:49:07

标签: c# styles resharper

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

Dooberry dooberry = new Dooberry();

var dooberry = new Dooberry();

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

13 个答案:

答案 0 :(得分:36)

这当然是一种风格问题,但我同意Dare:C# 3.0 Implicit Type Declarations: To var or not to var?。我认为使用var而不是显式类型会使代码的可读性降低。在以下代码中:

var result = GetUserID();

结果如何?一个int,一个字符串,一个GUID?是的,这很重要,不,我不应该通过代码来了解。它在代码示例中特别烦人。

杰夫写了一篇关于此的帖子,说he favors var。但那家伙很疯狂!

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

答案 1 :(得分:11)

我只在明显知道var是什么时使用它。

对我说清楚:

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

我不清楚:

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

答案 2 :(得分:9)

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

我公司的标准是在任何地方使用var,我们在reading various recommendation and then spending some time trying it out to see whether the lack of annotated type information was a help or a hindrance之后来到。我们觉得这是一个帮助。

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

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

答案 3 :(得分:4)

@jongalloway - var不一定会使您的代码更难以理解。

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

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

var myvariable = ResultFromMethod();

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

编辑:刚刚阅读文章,我同意。洛尔。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

对这个@ Coding Horror

进行了很好的讨论

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

答案 6 :(得分:1)

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

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

约翰。

答案 7 :(得分:1)

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

答案 8 :(得分:1)

C# 9.0 中有一种通过 Target-typed new expressions 初始化类的新方法。

你可以这样初始化类:

Dooberry dooberry = new();

就我个人而言,与使用 var 相比,我更喜欢它,而且它对我来说更具可读性。

关于调用方法,我认为这取决于您。就个人而言,我更喜欢指定类型,因为我认为这样更易读:

Dooberry dooberry = GetDooberry();

在某些情况下,很清楚类型是什么,在这种情况下,我使用var:

var now = DateTime.Now;

答案 9 :(得分:0)

“最佳风格”是主观的,取决于具体情况。

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

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

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

干杯!

答案 10 :(得分:0)

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

任何可以为变量及其值指定类型名称的单行语句都应该使用var,特别是当它是一个很长的Generic< OtherGeneric< T,U,V>,词典< X,Y>>>

答案 11 :(得分:0)

这个主题有一个really good MSDN article,它概述了一些你不能使用var的情况:

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

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

我建议您查看它以了解在代码中使用var的全部含义。

答案 12 :(得分:0)

  

我看到了stackoverflow的模式   成功:挖掘旧的CodingHorror帖子   和(危险的风格)短语他们   问题的条款。

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