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

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

Should I *always* favour implictly typed local variables in C# 3.0?

雷斯哈珀当然是这么想的,从盒子里它会让你改变信仰。

1
Dooberry dooberry = new Dooberry();

1
var dooberry = new Dooberry();

那真的被认为是最好的款式吗?


当然,这是一个风格问题,但我同意dare:c 3.0隐式类型声明:到var还是不到var?.I认为使用var而不是显式类型会降低代码的可读性。在以下代码中:

1
var result = GetUserID();

结果是什么?一个int,一个字符串,一个guid?是的,这很重要,不,我不应该为了知道而钻研代码。这在代码示例中尤其令人讨厌。

杰夫写了一篇关于这个的文章,说他喜欢var,但那个家伙疯了!

我看到了stackoverflow成功的模式:挖掘旧的编码恐怖帖子,然后(危险风格)用一个问题来表达它们。


我只在很明显什么是VaR时使用它。

我明白:

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

我不清楚:

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


对于这个问题,我所看到的答案最好的总结是埃里克·利珀特的评论,它本质上说,如果具体的类型很重要,你应该使用具体的类型,而不是其他类型。本质上,类型信息应该保留在类型重要的地方。

我公司的标准是在任何地方都使用var,这是我们在阅读了各种建议之后得出的,然后花一些时间尝试,看看缺少注释类型信息是一种帮助还是一种阻碍。我们觉得这是一种帮助。

人们联系到的大多数建议(例如,dare's的建议)都是由从未尝试过用var而不是具体类型编码的人提出的建议。这使得这些建议几乎一文不值,因为它们不是根据经验说话,它们只是推测而已。

我能给你的最好建议是亲自尝试,看看什么对你和你的团队有效。


@jongalloway-var不一定会使代码更不可读。

1
2
var myvariable = DateTime.Now
DateTime myvariable = DateTime.Now;

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

1
var myvariable = ResultFromMethod();

这里,有一点,var可以使代码的可读性变差。我喜欢var,因为如果我把一个小数改成double,就不必在一堆地方改变它(不要说重构,有时我会忘记,让我var!)

编辑:我同意,只要看一下文章。大声笑。


有一个很好的讨论这个@编码恐怖

就我个人而言,我尽量减少它的使用,我发现它会损害可读性,特别是当从方法调用中分配变量时。


我有一种感觉,随着时间的推移,这将是堆栈溢出问题中最流行的问题之一。归根结底就是偏好。无论你认为什么都更易读。当类型在右侧定义时,我更喜欢var,因为它更简洁。当我从方法调用中分配变量时,我使用显式类型声明。


只有当你事先不知道类型的时候才有意义。


像resharper这样的工具的一个优点是,您可以随意编写代码,然后让它重新格式化为更易于维护的代码。我将r设置为始终重新格式化,以便在编写代码时可以看到实际使用的类型,但我几乎总是键入"var"。

好的工具让你拥有两个世界中最好的。

厕所。


I'm seeing a pattern for stackoverflow
success: dig up old CodingHorror posts
and (Jeopardy style) phrase them in
terms of a question.

我请求无罪!但你是对的,这似乎是一个比较流行的小问题。


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

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

  • var can only be used when a local variable is declared and initialized
    in the same statement; the variable
    cannot be initialized to null, or to a
    method group or an anonymous function.
  • var cannot be used on fields at class scope.
  • Variables declared by using var cannot be used in the initialization
    expression. In other words, this
    expression is legal: int i = (i = 20);
    but this expression produces a
    compile-time error: var i = (i = 20);
  • Multiple implicitly-typed variables cannot be initialized in the same
    statement.
  • If a type named var is in scope, then the var keyword will resolve to
    that type name and will not be treated
    as part of an implicitly typed local
    variable declaration.

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


不,不总是,但我会说很多时间。类型声明并没有比匈牙利符号更有用。您仍然面临着同样的问题,类型可能会发生变化,重构工具也有助于解决这一问题,因为与不必在指定类型的地方进行更改相比,重构工具并不理想,除非是在一个单独的地方,这遵循了"不要重复自己"的原则。

可以为变量及其值同时指定类型名称的任何单行语句都应绝对使用var,特别是当它是long generic,dictionary>>


"最佳风格"是主观的,根据上下文而不同。

有时,使用"var"比键入一些非常长的类名更容易,或者如果您不确定给定函数的返回类型。我发现在处理Linq或In-for循环声明时,更多地使用了"var"。

其他时候,使用完整类名比使用"var"更好地记录代码更有用。

我觉得由开发人员决定。没有银弹。没有"一条真正的路"。

干杯!


推荐阅读