已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。
与同事讨论了在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 和IEnumerable 的重载方法中,调用者可能会无意中传递错误的类型。
var 确实 保持强类型,但是问题实际上是类型在定义时不立即变得危险吗?当重载意味着在无意中将错误类型传递给方法时,可能不会发出编译器错误,这种情况会放大。
var
我仍然认为var在某些情况下可以使代码更具可读性。如果我有一个具有Orders属性的Customer类,并且想要将其分配给变量,则只需执行以下操作:
var orders = cust.Orders;
我不在乎Customer.Orders是IEnumerable<Order>,ObservableCollection<Order>或者BindingList<Order>-我要的是保持该列表在内存中遍历,或以后得到了数什么的。
IEnumerable<Order>
ObservableCollection<Order>
BindingList<Order>
将以上声明与:
ObservableCollection<Order> orders = cust.Orders;
对我来说,类型名称只是噪音。如果我返回并决定更改Customer.Orders的顺序(例如从ObservableCollection<Order>to IList<Order>),那么我也需要更改该声明-如果我在第一个中使用var则不必这样做地点。
IList<Order>