29

Resharper肯定是这么认为的,并且开箱即用它会唠叨你转换

Dooberry dooberry = new Dooberry();

var dooberry = new Dooberry();

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

4

13 回答 13

39

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

var result = GetUserID();

结果是什么?一个int,一个字符串,一个GUID?是的,这很重要,不,我不应该通过挖掘代码来知道。在代码示例中尤其烦人。

Jeff 写了一篇关于这个的帖子,说他喜欢 var。但这家伙疯了!

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

于 2008-08-19T21:53:38.443 回答
12

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

我清楚:

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

我不清楚:

var itemList = rssNode.SelectNodes("item");
var rssItems = new RssItem[itemList.Count];
于 2008-08-20T02:26:04.950 回答
9

我看到的答案的最佳总结是Eric Lippert 的评论,它基本上说如果类型是重要的,你应该使用具体类型,否则不要使用。本质上,类型信息应该保留给类型很重要的地方。

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

人们链接到的大多数建议(例如 Dare 的建议)都是由从未尝试过使用 var 而不是具体类型进行编码的人提出的建议。这使得这些建议几乎毫无价值,因为它们不是根据经验说话,它们只是在推断。

我能给你的最好建议是自己尝试一下,看看什么对你和你的团队有用。

于 2008-09-21T17:26:18.677 回答
4

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

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

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

var myvariable = ResultFromMethod();

在这里,您有一点, var 可能会使代码的可读性降低。我喜欢 var 因为如果我将小数更改为双精度,我不必在一堆地方更改它(不要说重构,有时我会忘记,让我 var!)

编辑:只需阅读文章,我同意。哈哈。

于 2008-08-19T22:26:44.447 回答
2

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

于 2008-08-19T21:53:12.703 回答
2

对此@Coding Horror进行了很好的讨论

就我个人而言,我尝试将其使用降至最低,我发现它会损害可读性,尤其是在从方法调用中分配变量时。

于 2008-08-19T21:55:23.620 回答
1

像 ReSharper 这样的工具的优点之一是,您可以随心所欲地编写代码,然后将其重新格式化为更易于维护的东西。我将 R# 设置为始终重新格式化,以便实际使用的类型可见,但是,在编写代码时,我几乎总是输入“var”。

好的工具让你两全其美。

约翰。

于 2008-08-19T22:46:10.407 回答
1

只有当您事先不知道类型时,它才有意义。

于 2009-03-19T02:07:26.163 回答
1

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

您可以像这样初始化类:

Dooberry dooberry = new();

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

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

Dooberry dooberry = GetDooberry();

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

var now = DateTime.Now;
于 2021-06-22T22:48:06.713 回答
0

“最佳风格”是主观的,因上下文而异。

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

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

我觉得应该由开发商来决定。没有银弹。没有“一种真正的方式”。

干杯!

于 2008-08-19T21:54:30.813 回答
0

总是,但我会说很多时间。类型声明并不比匈牙利符号有用得多。您仍然有相同的问题,即类型可能会更改,并且重构工具很有帮助,因为与不必更改指定类型的位置(除了在单个位置之外)相比,它并不理想,这遵循不要重复自己原则。

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

于 2008-08-19T21:55:07.910 回答
0

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

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

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

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

于 2008-08-20T01:53:58.333 回答
0

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

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

于 2008-08-20T14:24:04.023 回答