除了明显使用var
LINQ 之外,我还使用它来缩写毛茸茸的变量声明以提高可读性,例如:
var d = new Dictionary<string, Dictionary<string, Queue<SomeClass>>>();
总的来说,我从静态类型中获得了一种安慰(因为需要一个更好的词),这让我不愿意放弃它。我喜欢在声明变量时知道自己在做什么的感觉。声明一个变量不仅仅是告诉编译器一些事情,它是告诉阅读你的代码的人一些事情。
让我给你举个例子。假设我有一个返回List<string>
. 这段代码当然是正确的,我认为 90% 的 C# 开发人员可能会这样写:
List<string> list = MyMethod();
很明显,对吧?事实上,这是一个您可以轻松使用的地方var
。
真是的。但是这个版本的代码不仅仅是声明一个变量,它告诉我编写它的人打算做什么:
IEnumerable<string> list = MyMethod();
编写该代码的开发人员告诉我“我不会更改此列表,也不会使用索引来访问其成员。我要做的就是遍历它。” 在一行代码中可以获取大量信息。如果您使用var
.
当然,如果你一开始没有使用它,你就不会放弃它。如果你是那种会编写那行代码的开发人员,你已经知道你不会var
在那里使用。
编辑:
我刚刚重读了 Jon Skeet 的帖子,Eric Lippert 的这句话让我大吃一惊:
隐式键入的本地人只是一种小方法,您可以通过这种方式不强调如何,从而强调什么。
我认为实际上在很多情况下使用隐式类型会留下隐含的内容。不纠结于什么也没关系。例如,我会随便写一个 LINQ 查询,如:
var rows = from DataRow r in parentRow.GetChildRows(myRelation)
where r.Field<bool>("Flag")
orderby r.Field<int>("SortKey")
select r;
当我阅读该代码时,我在阅读它时想到的一件事是“rows
是一个IEnumerable<DataRow>
.”。因为我知道 LINQ 查询返回的是IEnumerable<T>
,并且我可以在此处看到正在选择的对象的类型。
这是一个没有明确说明的情况。留给我去推断。
现在,在我使用 LINQ 的大约 90% 的情况下,这一点都不重要。因为 90% 的时间,下一行代码是:
foreach (DataRow r in rows)
但是不难想象在其中声明rows
为非常有用的IEnumerable<DataRow>
代码 - 查询许多不同类型的对象的代码,将查询声明放在迭代旁边是不可行的,它会是能够rows
使用 IntelliSense 进行检查很有用。那是什么,而不是如何。