在与同事讨论了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) 根据指定的表达式,类型是明显的(即var foo = new TypeWithAReallyLongNameTheresNoSenseRepeating())

Var没有性能影响,因为它是语法糖;一旦编译成IL,编译器就会推断出类型并定义它;没有什么动态的东西。

其他回答

我想这取决于你的看法。我个人从来没有因为var“误用”而理解一段代码有任何困难,我的同事和我都经常使用它。(我同意智能感知在这方面是一个巨大的帮助。)我欢迎它作为一种消除重复性麻烦的方法。

毕竟,如果语句像

var index = 5; // this is supposed to be bad

var firstEligibleObject = FetchSomething(); // oh no what type is it
                                            // i am going to die if i don't know

如果真的无法处理,没有人会使用动态类型语言。

@erlando,

谈到重构,通过将新类型的实例分配给一个变量而不是在多个地方更改它来更改变量类型似乎要容易得多,不是吗?

至于代码审查,我认为var关键字没有大问题。在代码审查期间,我更喜欢检查代码逻辑而不是变量类型。当然,可能会有开发人员可以使用不合适的类型的情况,但我认为这种情况的数量是如此之少,它不会成为我停止使用var关键字的原因。

我重复一下我的问题。为什么变量类型对您很重要?

Kronoz -在这种情况下(两者都重载)会有问题吗?如果你有两个不同类型的重载,本质上你会说任何一个都可以被传递,做同样的事情。

不应该有两个重载根据传递的类型执行完全不同的操作。

虽然在这种情况下您可能会感到困惑,但它仍然是完全类型安全的,只是有人调用了错误的方法。

我认为你可能误解了c#中var的用法。它仍然是强类型,不像VB的变体类型,所以使用或不使用它对性能没有影响。

因为它对最终编译的代码没有影响,所以它实际上是一个设计器的选择。就我个人而言,我不使用它,因为我发现定义了完整类型的代码更容易阅读,但我可以想象,几年后,完整类型声明将像现在的匈牙利符号一样被看待——额外的类型与默认情况下智能感知提供给我们的信息相比并没有真正的好处。

我认为var的使用应该与明智选择的变量名称相结合。

我在foreach语句中使用var没有问题,前提是它不是这样的:

foreach (var c in list) { ... }

如果是这样的话:

foreach (var customer in list) { ... }

... 这样,阅读代码的人就更有可能理解什么是“列表”。如果您可以控制列表变量本身的名称,那就更好了。

这同样适用于其他情况。这是非常无用的:

var x = SaveFoo(foo);

... 但这是有道理的:

var saveSucceeded = SaveFoo(foo);

各有各的,我想。我发现自己这样做,简直是疯了:

var f = (float)3;

我需要一个12步的var程序。我叫Matt,我(ab)使用var。