代码之家  ›  专栏  ›  技术社区  ›  Corey Ogburn

使用var比C中的显式类型有什么优势?[复制品]

  •  11
  • Corey Ogburn  · 技术社区  · 14 年前

    可能重复:
    What’s the point of the var keyword?
    Use of var keyword in C#

    我知道怎么做 IEnumerable<...> 因为数据类型会使代码的可读性降低一点,或者嵌套的泛型看起来有点令人生畏。但是除了代码可读性之外,使用var而不是显式类型还有什么好处呢?似乎通过使用显式类型,您最好传递变量的功能,因为您知道它是什么。

    如果这是一个工作场所编码标准,我使用它是为了团队合作。然而,在我自己的项目中,我更喜欢避免使用var。

    9 回复  |  直到 14 年前
        1
  •  18
  •   Coding Flow    14 年前

    var的要点是允许匿名类型,没有它它们就不可能,这就是它存在的原因。我认为所有其他的用途都是懒惰的编码。

        2
  •  8
  •   tvanfosson    14 年前

    我喜欢它,特别是在单元测试中,因为随着代码的发展,我只需要修复声明/分配的右侧。显然,我还必须更新以反映用法的更改,但在声明时,我只需要做一次更改。

        3
  •  8
  •   JaredPar    14 年前

    使用 var 因为foreach块的迭代器变量比显式类型名更安全。例如

    class Item {
      public string Name; 
    }
    foreach ( Item x in col ) {
      Console.WriteLine(x.Name);
    }
    

    此代码可以编译而不发出警告,但仍会导致运行时强制转换错误。这是因为foreach循环与 IEnumerable IEnumerable<T> . 前者返回的值类型为 object 而C编译器只是对 Item 在引擎盖下面。因此,它是不安全的,可能导致运行时错误,因为 可枚举的 可以包含任何类型的对象。

    另一方面,以下代码将只执行以下操作之一

    1. 不编译是因为 x 键入 对象 或其他没有名称字段/属性的类型
    2. 编译并保证在枚举时不会出现运行时强制转换错误。

    “x”的类型为 对象 在情况下 可枚举的 T 在情况下 IEnumerable<t> . 编译器不执行强制转换。

    foreach ( var x in col ) {
      Console.WriteLine(x.Name);
    }
    
        4
  •  4
  •   kbrimington    14 年前

    它不会对发出的IL产生有意义的变化。这只是一个代码样式的首选项。

    例如,我喜欢它,尤其是在处理具有长的、通用的、几乎不可读的名称的类型时,例如 Dictionary<string, IQueryable<TValue1, TValue2>>[] .

        5
  •  2
  •   Markos    14 年前

    这个 var 只是一种句法上的糖分。在编译时总是知道变量是什么类型。使用var关键字没有其他优势。

        6
  •  2
  •   Mike M.    14 年前

    没有什么真正的区别。有些人建议使用显式类型,因为它可以使代码维护更容易。然而,那些追求 var 有这样的立场:“如果我们使用var,我们就必须使用好的命名约定”。

    当然,如果您使用vars的目的是要有良好的命名约定,但这样做失败了,那么在这条路上会更加痛苦。(国际海事组织)

        7
  •  1
  •   Jimmy Hoffa    14 年前
    public IAwesome { string Whatever { get; } }
    public SoCool : IAwesome { public string Whatever { get; } }
    
    public HeyHey
    {
        public SoCool GetSoCool() { return new SoCool(); }
    
        public void Processy()
        {
            var blech = GetSoCool();
            IAwesome ohYeah = GetSoCool();
            // Now blech != ohYeah, so var is blech and ohYeah is IAwesome.
        }
    }
    
        8
  •  0
  •   Daniel Pratt    14 年前

    除了您提到的可读性方面,“var”还有一个好处,那就是减少了一个微小的代码更改将破坏代码其他部分的可能性。例如,如果重命名类型。或者,如果切换到与前一种类型(例如,从foo[]更改为ienumerable)基本兼容的其他类型,则将代码恢复到可编译状态所需的工作就要少得多。

        9
  •  0
  •   DaveDev    14 年前

    您可以抽象出技术性的心理复杂性,从模型中纯关注问题领域。必须确保变量的命名有意义。