除了明显的使用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
。
编辑:
我只是重读乔恩斯基特的帖子,并从埃里克利珀这句话在我跳了出来:
隐式类型当地人都在其中您可以淡化的只是一个小方法如何从而强调什么。
我觉得实际上在很多情况下使用隐式打字就是留下什么隐含的。只是没有详细说明。当我读到这些代码,当我读它是“rows
是IEnumerable<DataRow>
我想的事情之一
var rows = from DataRow r in parentRow.GetChildRows(myRelation)
where r.Field<bool>("Flag")
orderby r.Field<int>("SortKey")
select r;
:比如,我随便写LINQ查询等。“因为我知道什么LINQ查询返回的IEnumerable<T>
,我可以看到被选择在那里的对象的类型。
这其中有什么没有已经作出了明确的情况下,它已经离我而去。推断
现在,在这里我使用LINQ的案件约90%,这不要紧,一个小小的点点,因为时间的90%,代码的下一行是:
foreach (DataRow r in rows)
但是,设想将rows
声明为非常有用的代码并不难IEnumerable<DataRow>
- 代码中查询了很多不同种类的对象,将查询声明放在迭代旁边是不可行的,并且能够使用IntelliSense检查rows
会很有用。这是一件什么事,而不是一件事。
伟大的问题。 – Contango 2010-10-18 17:44:02