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

时间:2010-08-06 16:57:08

标签: c# var

  

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

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

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

9 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:8)

我喜欢它,尤其是在单元测试中,因为随着代码的发展,我只需要修改声明/赋值的右侧。显然我也必须更新以反映使用的变化,但在声明时我只需要进行一次更改。

答案 2 :(得分:8)

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

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

此代码可以在没有警告的情况下编译,但仍会导致运行时转换错误。这是因为foreach循环适用于IEnumerableIEnumerable<T>。前者返回类型为object的值,C#编译器只为你引导到Item。因此它不安全并且可能导致运行时错误,因为IEnumerable可以包含任何类型的对象。

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

  1. 未编译,因为x已键入object或其他类型没有名称字段/属性
  2. 编译并保证在枚举时没有运行时强制转换错误。
  3. object的情况下,'x'的类型为IEnumerableT的情况为IEnumerable<T>。编译器没有进行转换。

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

答案 3 :(得分:4)

它在发射的IL中没有产生任何有意义的变化。它只是一种代码风格偏好。

我喜欢它,特别是在处理具有Dictionary<string, IQueryable<TValue1, TValue2>>[]等长,通用,几乎不可读的名称的类型时。

答案 4 :(得分:2)

var只是一种语法糖。在编译时总是知道变量的类型。使用var关键字没有其他优点。

答案 5 :(得分:2)

没有任何真正的差异。有些人建议使用显式类型,因为它可以使代码维护更容易。但是,推动var的人的立场是“如果我们使用var,我们就会被迫使用良好的命名约定”。

当然,如果你使用vars的目的是要有良好的命名约定并且会崩溃,那么在未来的道路上会更加痛苦。 (IMO)

答案 6 :(得分:1)

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.
    }
}

答案 7 :(得分:0)

除了你提到的可读性方面,“var”还有一个好处,就是减少一个简单的代码更改会破坏代码的其他部分的可能性。例如,如果重命名类型。或者,如果切换到与前一种类型大多兼容的其他类型(例如,从Foo [更改为IEnumerable),那么将代码恢复到可编译状态的工作要少得多。

答案 8 :(得分:0)

您可以抽象出技术性的心理复杂性,将其完全集中在模型中的问题域上。你必须确保你的变量有意义地命名。