在与同事讨论了 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
确实保持强类型,但问题是类型在定义时不立即显现是否很危险,当重载时会放大的东西意味着当您无意中将错误的类型传递给方法时可能不会发出编译器错误。