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

Cor*_*urn 11 c# var

可能的重复:
var关键字的重点是什么?
在C#中使用var关键字

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

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

Ben*_*son 18

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

  • 懒?它通过较少的击键来实现相同的功能.从应用程序的角度来看,它是原始效率. (14认同)
  • @Gusdor可以说,如果它是隐式定义的,那么查看类型会有点困难.我倾向于遵循以下模式:如果类型很长且复杂,例如Something <SomethingElse <T >>并且更容易从变量名称中推断,请使用var.否则我明确指定类型. (7认同)
  • var的另一个优点是您不需要添加using语句.例如var cars = GetCars(); 没有必要添加"使用Namespace.Car",如果用汽车替换var,你必须这样做. (5认同)
  • 懒惰 = 整体效率 “我选择一个懒惰的人来做艰苦的工作。因为懒惰的人会找到一种简单的方法来做到这一点。” - 比尔盖茨 (2认同)

tva*_*son 8

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

  • 这是我从代码中删除的第一个原因. (4认同)

Jar*_*Par 8

使用varforeach块作为迭代器变量比显式类型名称更安全.例如

class Item {
  public string Name; 
}
foreach ( Item x in col ) {
  Console.WriteLine(x.Name);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

类型的"x"将是object在的情况下IEnumerableT在的情况下IEnumerable<T>.编译器不进行转换.

foreach ( var x in col ) {
  Console.WriteLine(x.Name);
}
Run Code Online (Sandbox Code Playgroud)

  • 问题#1:如果`var x`解析为`object`,则无法访问`Name`属性.你还是要施展. (2认同)