使用隐式types局部variables

我刚刚安装了ReSharper的试用版本,我注意到的第一件事情是,它总是build议用隐式types的types来replace显式的局部variables,例如:

public string SomeMethod(int aParam) { int aNumber = SomeOtherMethod(aParam); // should be changed to: var aNumber = SomeOtherMethod(aParam); } 

我认为明确的typesvariables更可读(更明确)。

你对ReSharper的build议有什么看法? 使用隐式typesvariables有什么好处吗? 什么时候使用隐式/显式variables?

我个人只使用“var”,当我可以通过阅读声明清楚地区分variablestypes,例如:

 var someVariable = new List<int>(); 

在上面的例子中,显然“var”指的是“List <int>”。

我不喜欢使用“var”,当我必须去一些方法定义来找出什么variablestypes“var”代表或通过依靠visual studio intelli-popup或任何被称为,例如这在对我不好:

 var someVaraible = SomeMethod(); 

我的意思是,什么是“SomeMethod”函数应该返回? 你能通过查看代码行吗? 不,你不能,所以这就是为什么我避免在这些情况下使用“var”。

这里有很多讨论,但我认为这一切都归结为个人的品味,就像几乎在任何地方使用“这个”关键字一样。

个人更喜欢明确的typesvariables,但是当使用嵌套的generics集合时,事物可以通过使用隐式typesvariables变得更加可读。 看着:

 Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>(); 

VS:

 var myDictionary = new Dictionary<string, Dictionary<string, string>>(); 

编辑:这个SO主题涵盖了相同的主题,与一些不错的回复: 使用什么:var或对象名称types?

编辑2:现在与asynchronous工作很多,我发现使用明确typesvariables有时可以防止讨厌的错误。 考虑这个愚蠢的例子,你会想要返回一个用户的ID。 还要考虑GetUserAsync返回一个Task<User> 。 如果你使用隐式types的variables,你最终会使用这样的东西:

 public long GetUserId() { var user = GetUserAsync(); return user.Id; } 

这编译,但它是错误的。 'user'实际上是一个Task<User> 。 它编译为Task也有一个Id属性。 在这种情况下,会意外返回一个任务的Id而不是User。

 public long GetUserId() { User user = GetUserAsync(); return user.Id; } 

上面的代码不会编译,因为编译器会抱怨你不能把任务投给用户。 添加await关键字当然可以解决这个问题。

我曾经遇到过这种情况:-)

以防万一有人还没有注意到,你可以很容易地改变重构器的“build议”(重构器 – >选项 – >语言 – >上下文操作 – >“用'var'replace显式types说明”)。

我个人比较喜欢在各个地方都有明确的types规格,但是我并不是很挑剔。

有时候inputvar伪关键字比一个巨大的types名称更容易,特别是如果涉及generics的话。 但是,您应该知道它们在function上是相同的。 没有性能差异或任何方式。 编译器派生出赋值右侧的types,并用该typesreplacevar。 它不像VB变体那样在运行时发生。

FWIW,var关键字在许多情况下是可读的。 特别是如果…

  1. 赋值的右边是一个构造函数expression式。

    var map = new Dictionary>();

  2. 局部variables有很好的名字。

HTH