65

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

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

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

您如何看待 ReSharper 的建议?使用隐式类型变量有什么好处吗?你什么时候使用隐式/显式变量?

4

5 回答 5

74

我个人只在通过阅读声明就能清楚地区分变量类型的情况下使用“var”,例如:

var someVariable = new List<int>();

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

当我必须去一些方法定义来找出变量类型“var”代表什么或不得不依赖于 Visual Studio intelli-popup 或任何被调用的东西时,我不喜欢使用“var”,例如这个在我不行:

var someVaraible = SomeMethod();

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

于 2009-03-16T15:48:22.977 回答
39

关于这个有很多讨论,但我认为这完全取决于个人喜好,就像几乎在任何地方都使用“this”关键字一样。

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

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

与:

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

编辑:这个 SO 主题涵盖了相同的主题,并有一些很好的回复:使用什么:var 或对象名称类型?

EDIT2:现在大量使用异步,我发现使用显式类型变量有时可以防止讨厌的错误。考虑这个愚蠢的示例,您希望返回用户的 Id。还要考虑GetUserAsync返回 a Task<User>。如果你使用隐式类型的变量,你最终会使用这样的东西:

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

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

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

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

我实际上曾经发生过这种情况:-)

于 2009-03-16T15:40:29.250 回答
17

万一有些人还没有注意到,您可以轻松地更改 Reshaper 中的“建议”(Reshaper -> Options -> Languages -> Context Actions -> “Replace explicit type specification with 'var'”)。

我个人更喜欢到处都有明确的类型规范,但我对此并不太挑剔。

于 2009-03-16T17:06:21.773 回答
6

有时键入 var 伪关键字比键入巨大的类型名称更容易,尤其是在可能涉及泛型的情况下。但是,您应该知道它们在功能上是相同的。没有性能差异或任何一种方式。编译器派生赋值右侧的类型并将 var 替换为该类型。它不像 VB 变体那样在运行时发生。

于 2009-03-16T15:35:37.000 回答
6

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

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

    var map = new Dictionary>();

  2. 局部变量有好名字。

高温高压

于 2009-03-16T15:40:47.283 回答