一尘不染

在C#中使用var关键字

c#

已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。

与同事讨论了在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 确实
保持强类型,但是问题实际上是类型在定义时不立即变得危险吗?当重载意味着在无意中将错误类型传递给方法时,可能不会发出编译器错误,这种情况会放大。


阅读 265

收藏
2020-05-19

共1个答案

一尘不染

我仍然认为var在某些情况下可以使代码更具可读性。如果我有一个具有Orders属性的Customer类,并且想要将其分配给变量,则只需执行以下操作:

var orders = cust.Orders;

我不在乎Customer.Orders是IEnumerable<Order>ObservableCollection<Order>或者BindingList<Order>-我要的是保持该列表在内存中遍历,或以后得到了数什么的。

将以上声明与:

ObservableCollection<Order> orders = cust.Orders;

对我来说,类型名称只是噪音。如果我返回并决定更改Customer.Orders的顺序(例如从ObservableCollection<Order>to
IList<Order>),那么我也需要更改该声明-如果我在第一个中使用var则不必这样做地点。

2020-05-19