【问题标题】:Why not use var everywhere?为什么不到处使用 var 呢?
【发布时间】:2011-05-10 14:55:33
【问题描述】:

除了非人类可读的代码之外,还有另一个理由不为函数中的每个变量使用 var 吗?我的意思是不使用 int、SqlCommand、string 而是使用 var 会影响性能吗?

【问题讨论】:

标签: c#-4.0 var


【解决方案1】:

使用或不使用“var” 不改变其他可观察的 程序的特点,例如 作为它的表现。

问题 是否使用“var”铰链 对人类读者的影响 和代码的维护者,而不是 它对编译后的工件的影响。

看看这篇优秀的文章:https://docs.microsoft.com/en-gb/archive/blogs/ericlippert/uses-and-misuses-of-implicit-typing

【讨论】:

  • 谁在这里横冲直撞,否决了所有答案?
  • Lippert 先生没有提到的一个因素是变量是否会被写入其声明以外的任何地方。假设代码包含类似var MyCar = FirstCarFactory.MakeCar(); 的语句,以及代码后面的MyCar = SecondCarFactory.MakeCar();。如果两个工厂都返回类型ICar,即使工厂返回的对象实例是不同的类型,代码也会起作用。另一方面,代码将要求工厂返回类型ICar,而不是它们生成的特定类型的对象。如果消费者代码改为...
  • ...ICar MyCar = FirstCarFactory.MakeCar();,即使第一家汽车工厂的返回类型是ToyotaPriusHatchback 而不是ICar,它也能正常工作。需要指定变量的类型应该是ICar 而不是ToyotaPriusHatchback,这是因为它将被写在声明之外的其他地方。如果它仅由定义它的行编写,那么如果 MyCarToyotaPriusHatchback 就好了。
【解决方案2】:

这绝对不会影响性能。 var 实际上不是类型,而是代码中的占位符,这意味着“我不想写出这个变量的类型”。事实上,如果您将鼠标悬停在 Visual Studio 中的文本上,它会显示一个工具提示,指出您认为太长而无法编写的类型!

不过,严肃地说,当您从代码中清楚类型是什么时,您通常应该使用 var,以免其他人在阅读时感到困惑。

【讨论】:

    【解决方案3】:

    是的,在任何地方都使用var

    我喜欢 var。它为我节省了大量的击键。它帮助我以“使用优先”的方式编写代码,并且使重构更加强大。

    类型的名称无关紧要。 Intellisense 告诉我类型可以做什么,这才是最重要的。

    即使我知道类型名称,如果智能感知被破坏也对我没有多大帮助,因为我不一定知道仅从类型名称中调用的特定方法或属性。

    var 让事情变得更好的一些细节:

    • 调用方法(不知道它返回什么 - 尤其是泛型类型时)

    这个很大。我经常不记得方法返回什么,但我知道该方法的名称。不得不将返回类型从我的脑海中拉出来让我慢下来。我只写var,用我的输入调用该方法,然后智能感知告诉我返回类型是什么以及我可以用它做什么。

    // Imagine a method that creates a return type that gets some generic type from the call arguments
    Tuple<TA,TB,TC,TD,TE> Combine<TA,TB,TC,TD,TE>(TA a, TB b, TC c, TD d, TE e);
    
    // GOOD: Call this with var
    var combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");
    
    // BAD: Without var
    Tuple<string, int, bool, Dictionary<int, List<string>>, string> combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");
    
    • 重构返回类型

    如果我使用var,编译器会立即告诉我该类型在哪里被滥用(也许新的返回类型没有相同的属性名称)。

    如果我不使用var,我只会收到有关分配类型失败的错误。然后,我必须将该类型更改为新类型(调用它的每个地方),最后我会收到错误使用该类型的警告。

    • 专注于命名变量而不是重新键入类型名称。

    var 是 C# 发生过的最好的事情之一。

    // BAD: No var
    Dictionary<int,List<Tuple<int,bool,string>>> ahhhhThatWasDifficult = new Dictionary<int,List<Tuple<int,bool,string>>>();
    
    // GOOD: With var
    // I can think of a good name before writing this complex type
    var validNameCountDictionary = new Dictionary<int,List<Tuple<int,bool,string>>>();
    

    如果我还没有说服你,那么你别无选择,如果你想使用:

    • 匿名类型
    • 林克

    那么,为什么不一路走下去,到处使用var

    我知道它晦涩难懂,但有时我什至会这样做,这样我就可以始终使用 var 并对我的代码保持一致的外观:

    var number = (int?) null;
    

    因为我喜欢 var。

    附言我有点难过 let 正在替换 Typescript/ES6 中的 var,但是 Javasctipt var !== C# var

    【讨论】:

    • 我喜欢像 rust 这样的类型推断和静态语言
    • 在你所有的代码 sn-ps 中(特别是第二和第三个),这就是微软的Programming Guide 建议做的事情。除了表达很多关于它的情感之外,你并没有真正对var 说任何新的东西。我不同意强迫编码人员考虑改变类型总是一件坏事。这取决于代码库的文化。在任何地方使用var 的真正价值在于它使类型变得不那么重要,就像无类型语言一样。就是这样。
    【解决方案4】:

    在为变量检索值的同时没有声明变量的情况很少见。所以var不能在这些情况下有效地使用。

    示例 - 调用仅基于传递给它的对象类型的方法。

    Derived d = null; // there is nothing to infer the type from
    var someInfo = GetInfo(d);
    
    ...
    
    // Base is an ancestor of Derived    
    Info GetInfo(Base b)
    {
       if (b is Derived) return ...;
       if (b is Derived2) return ...;
       ...
    }
    

    也许你也可以这样做:

    var d = default(Derived);
    

    var d = (Derived)null;
    

    但 IMO 的可读性也更高。我不会为了使用var而这样做。

    【讨论】:

      【解决方案5】:

      关于implicit and explicit typing。 C#.NET 是一种类型化 语言,这意味着您可以定义存储在内存中的数据类型。如果你不定义它,你会降低一些操作的安全性,所以你想尽可能多地显式键入。但是在某些情况下,类型从您的代码中非常明显,因此您可以将其留给编译器来确定变量应该是什么类型,即implicit typing

      没有类型的一个问题是,在内存中,它本质上是一堆 1 和 0,这些数据可能意味着任何东西,所以如果你最初在位置 000001 处输入一个整数,然后尝试将其读取为 Cat (想象一下,这是某种类型),那么您刚刚从记忆中读出的任何内容都没有多大意义。这就是发明类型系统的原因,它可以告诉您将哪些数据存储在哪里,并确保您以人类可以再次理解的方式读回数据,而对于机器而言,它并不真正归根结底,数据是什么。

      【讨论】:

      • 请注意,var 不会取消类型。它只会让编译器为您选择正确的类型。如果你说var foo = bar(),那么foo还是会被严格键入,只是你不需要键入类型。 (双关语不是有意的,但已注明。)
      • 从存储和类型安全的角度来看,var完全与显式类型相同。某些操作“不太安全”是什么意思?
      • 这个答案对于 var 的工作原理极具误导性。
      • 这个答案是另一个混​​淆 C# 中 var 关键字的例子。 C# 中的 var 不是 Javascript 中的 var!
      • 因为这种情况,我投了赞成票。 Different types evaluated for keyword var.
      猜你喜欢
      • 2021-05-04
      • 1970-01-01
      • 2016-06-29
      • 2016-05-22
      • 2013-12-17
      • 2018-05-08
      • 1970-01-01
      • 2018-08-31
      • 2013-03-11
      相关资源
      最近更新 更多