使用隐式类型的局部变量

时间:2009-03-16 15:32:55

标签: c# coding-style implicit-typing

我刚刚安装了ReSharper的试用版,我注意到的第一件事就是它始终建议用隐式类型的替换显式类型的局部变量,例如:

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

我认为显式类型变量更具可读性(更明确)。

您如何看待ReSharper的建议?使用隐式类型变量有什么优势吗?你什么时候使用implicit / explict vars?

5 个答案:

答案 0 :(得分:74)

当我通过阅读声明清楚地区分变量Type时,我个人只使用“var”,例如:

var someVariable = new List<int>();

在上面的例子中,很明显“var”指的是“List&lt; int&gt;”。

我不喜欢使用“var”当我必须去一些方法定义来找出变量类型“var”表示什么或者必须依赖visual studio intelli-popup或者任何被调用的东西时,例如,这对我不好:

var someVaraible = SomeMethod();

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

答案 1 :(得分:40)

关于此问题有很多讨论,但我认为这完全取决于个人品味,就像几乎在所有地方使用'this'关键字一样。

个人更喜欢明确的类型变量,但是当使用嵌套的泛型集合时,使用隐式类型变量可以使事物更具可读性。看看:

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

VS

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

编辑:这个SO主题涵盖了相同的主题,并提供了一些不错的回复:What to use: var or object name type?

EDIT2:现在使用异步工作很多,我发现使用明确类型的变量有时可以防止令人讨厌的错误。考虑这个愚蠢的例子,你想要返回用户的Id。另请注意,GetUserAsync会返回Task<User>。如果你使用隐式类型变量,你最终会使用这样的东西:

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

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

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

以上内容无法编译,因为编译器会抱怨您无法将任务强制转换为用户。当然,添加await关键字可解决此问题。

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

答案 2 :(得分:17)

万一有些人还没有注意到,你可以轻松更改Reshaper中的“建议”(重塑器 - &gt;选项 - &gt;语言 - &gt;上下文操作 - &gt;“用'var'替换显式类型规范“)。

我个人更喜欢在任何地方都有明确的类型规格,但我并不是很挑剔。

答案 3 :(得分:6)

有时候输入var pseudo-keyword比使用巨大的类型名称更容易,特别是如果涉及泛型。但是,您应该知道它们在功能上是相同的。两种方式都没有任何性能差异。编译器派生赋值右侧的类型,并用该类型替换var。它不像VB变种那样在运行时发生。

答案 4 :(得分:6)

FWIW,在很多情况下,var关键字显然是可读的。特别是如果...

  1. 赋值的右侧是构造函数表达式。

    var map = new Dictionary&gt;();

  2. 本地变量名称很好。

  3. HTH