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

可能重复:
var关键字有什么意义?
在C#中使用var关键字

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

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

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

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

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

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

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

  1. 不编译因为xobject类型或其他类型没有Name字段/属性
  2. 枚举并保证在枚举时没有运行时强制转换错误。

IEnumerable的情况下,’x’的类型将是object ,而在IEnumerable的情况下,将是IEnumerable 编译器不进行转换。

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

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

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

我喜欢它,特别是在处理具有长,通用,几乎不可读的名称的类型时,例如Dictionary>[]

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

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

当然,如果你使用vars意图具有良好的命名约定并且打破了它,那么在未来的道路上会更加痛苦。 (IMO)

 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),那么将代码恢复到可编译状态的工作要少得多。

您可以抽象出技术性的心理复杂性,从而完全专注于模型中的问题域。 你必须确保你的变量有意义地命名。