与同事讨论了在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(someList中的var item){// ...}等值好。
这里确实有关于类型安全的问题-例如,如果我们将查询的结果放入接受IEnumerable <int>和IEnumerable <double>的重载方法中,调用者可能会无意中传递错误的类型。
var
确实保持强类型,但是问题实际上是类型在定义时不立即变得危险吗?当重载意味着在无意中将错误类型传递给方法时,可能不会发出编译器错误,这种情况会放大。
var i = 0;
==失败!var c = new CrazyFrigginLongClassName();
==赢了!
var readabilityBeDamned = true;