代码之家  ›  专栏  ›  技术社区  ›  M4N

使用隐式类型的局部变量[重复]

  •  63
  • M4N  · 技术社区  · 15 年前

    这个问题已经有了答案:

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

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

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

    你觉得雷斯哈珀的建议怎么样?使用隐式类型变量有什么好处吗?你什么时候使用暗示/解释变量?

    5 回复  |  直到 9 年前
        1
  •  74
  •   Rene    15 年前

    我个人只在通过阅读声明就能清楚区分变量类型时使用__var_,例如:

    var someVariable = new List<int>();
    

    在上面的示例中,很明显__var_指__list<int>__。

    我不喜欢使用__var_当我必须去一些方法定义以找出变量类型__var_代表什么,或者必须依赖于Visual Studio Intelli弹出窗口或调用的任何内容时,例如这对我来说是不确定的:

    var someVaraible = SomeMethod();
    

    我的意思是,应该返回的_ somemethod_函数是什么?你能通过看代码行来判断吗?不,你不能t,所以我避免在这些情况下使用var_。

        2
  •  40
  •   Community Nick Dandoulakis    7 年前

    关于这一点有很多讨论,但我认为这都取决于个人品味,就像在几乎所有地方都使用“this”关键字一样。

    亲自 更喜欢显式类型化的变量,但是当使用嵌套的泛型集合时,使用隐式类型化的变量可以使内容变得更可读。看看:

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

    VS:

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

    编辑:这个主题涵盖了同一个主题,有一些不错的回答: What to use: var or object name type?

    edit2:现在使用async做了很多工作,我发现使用显式类型的变量有时可以防止讨厌的错误。考虑一下这个愚蠢的例子,在这里您希望返回用户的ID。还要考虑一下 GetUserAsync 返回A Task<User> . 如果使用隐式类型的变量,则最终将使用如下内容:

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

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

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

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

    我真的有过一次这样的经历——)

        3
  •  17
  •   uli78    15 年前

    只是为了防止某些人还没有注意到,您可以轻松地在reformer中更改__建议_157;(reformer->options->languages->context actions->_156;将显式类型规范替换为__;var_)。

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

        4
  •  6
  •   Daniel Henry    15 年前

    有时键入var伪关键字比键入一个巨大的类型名更容易,特别是如果可能涉及到一个泛型。但是,您应该知道它们在功能上是相同的。这两种方式都没有性能差异。编译器派生赋值右侧的类型,并用该类型替换var。它不会像vb变体那样在运行时发生。

        5
  •  6
  •   Dustin Campbell    15 年前

    fwiw,var关键字在许多情况下都是可读的。尤其是如果…

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

      var map=新字典>();

    2. 局部变量有好的名称。

    高温高压