使用var比C#中的显式类型有什么优势?

What advantages does using var have over the explicit type in C#?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
What’s the point of the var keyword?
Use of var keyword in C#

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

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


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


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

1
2
3
4
5
6
class Item {
  public string Name;
}
foreach ( Item x in col ) {
  Console.WriteLine(x.Name);
}

此代码可以编译而不发出警告,但仍会导致运行时强制转换错误。这是因为foreach循环同时与IEnumerableIEnumerable一起工作。前者返回类型为object的值,C编译器只为您在引擎盖下执行到Item的转换。因此,它是不安全的,并且可能导致运行时错误,因为IEnumerable可以包含任何类型的对象。

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

  • 不编译,因为x是类型化为object或其他没有名称字段/属性的类型
  • 编译并确保在枚举时不会出现运行时强制转换错误。
  • "x"的类型在IEnumerable的情况下为object,在IEnumerable的情况下为T。编译器不执行强制转换。

    1
    2
    3
    foreach ( var x in col ) {
      Console.WriteLine(x.Name);
    }


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


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

    首先,我喜欢它,尤其是在处理具有长的、通用的、几乎不可读的名称的类型时,如Dictionary>[]


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

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


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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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.
        }
    }


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


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