在与同事讨论了c# 3中var关键字的使用后,我想知道人们对通过var适当使用类型推断的看法是什么?

例如,我很懒地在有问题的情况下使用var,例如:-

foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.

var更合法的用法如下:-

var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.

有趣的是,LINQ似乎是一个灰色区域,例如:-

var results = from r in dataContext.SomeTable
              select r; // Not *entirely clear* what results will be here.

结果很明显,因为它将是一个实现IEnumerable的类型,但它并不完全明显,与var声明一个新对象的方式相同。

当涉及到对象的LINQ时,情况就更糟了,例如:-

var results = from item in someList
              where item != 3
              select item;

这并不比等价的foreach(var item in someList){//…}相当于。

这里有一个关于类型安全的真正问题——例如,如果我们将该查询的结果放在一个接受IEnumerable<int>和IEnumerable<double>的重载方法中,调用者可能会无意中传入错误的类型。

Var确实保持强类型,但问题是,在定义中不立即显示类型是否危险,当重载意味着当你无意中将错误的类型传递给方法时,编译器可能不会发出错误,这种情况会被放大。


当前回答

我想你在你的问题中指出了var的主要问题:“我不需要弄清楚类型”。正如其他人指出的那样,var是有一席之地的,但如果你不知道你正在处理的类型,你很有可能会遇到问题——不是在所有情况下,但那里有足够的气味,所以你应该怀疑。

其他回答

在大多数情况下,只是输入它更简单——想象一下

var sb = new StringBuilder();

而不是:

StringBuilder sb = new StringBuilder();

有时它是必需的,例如:匿名类型,比如。

var stuff = new { Name = "Me", Age = 20 };

我个人喜欢使用它,尽管它会降低代码的可读性和可维护性。

@Keith -

在你们的比较中 IEnumerable < int > IEnumerable<double>你不需要 担心——如果你传递了错误的类型 您的代码无论如何都无法编译。

这并不完全正确——如果一个方法同时重载到IEnumerable<int>和IEnumerable<double>,那么它可能会无声地将意外推断的类型(由于程序中的其他一些更改)传递给错误的重载,从而导致不正确的行为。

我想问题是这种情况出现的可能性有多大!

我猜部分问题是var给给定的声明增加了多少混乱——如果不清楚某个东西是什么类型(尽管它是强类型的,编译器完全理解它是什么类型),有人可能会掩盖一个类型安全错误,或者至少需要更长的时间来理解一段代码。

在做了十年的Java专业人员之后,我在c#世界里还是个新手。我最初的想法是“哦,不!这就把类型安全丢进了下水道”。然而,我对var了解得越多,我就越喜欢它。

1) Var与显式声明的类型一样是类型安全的。这都是关于编译时语法糖。

2)遵循DRY原则(不要重复)。DRY是关于避免冗余的,在两边都命名类型肯定是冗余的。避免冗余就是要让你的代码更容易修改。

3)至于确切的型号……嗯. .我认为你应该有一个大致的概念你有一个整数,一个套接字,一些UI控件,等等。智能感知将从这里引导你。知道确切的类型通常并不重要。例:我认为99%的情况下你并不关心给定的变量是long还是int, float还是double。对于最后1%的情况,在真正重要的地方,只需将鼠标指针悬停在var关键字上方。

4)我曾看到过这样一种荒谬的观点:现在我们需要回到1980年风格的匈牙利疣,才能区分变量类型。毕竟,在蒂莫西·道尔顿(Timothy Dalton)扮演詹姆斯·邦德(James Bond)的时代,这是判断变量类型的唯一方法。但现在是2010年。我们已经学会了根据变量的用法和内容来命名变量,并让IDE指导我们确定它们的类型。只要继续这样做,var就不会伤害你。

总而言之,var不是什么大东西,但它确实是一个很好的东西,而且它是Java最好很快复制的东西。所有反对的观点似乎都是基于ide之前的谬误。我会毫不犹豫地使用它,我很高兴R#帮助我做到这一点。

var很好,因为它遵循经典的DRY规则,当在声明变量的同一行中指出类型时,它特别优雅。(例如var city = new city ())

大多数人忽视的是:

var something = new StringBuilder(); 

通常打字的速度没有

StringBuilder something = KEY'TAB'();