使用什么:var或对象名称类型?
这个问题在这里已经有了答案:
除了明显使用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>
非常有用 - 代码中查询了很多不同类型的对象,将查询声明放在迭代旁边是不可行的,并且能够使用IntelliSense检查rows
会很有用。 这是一件什么事,而不是一件事。
你会在这个问题上得到各种各样的意见 - 从“var var everywhere”到“只使用var,匿名类型,你基本上必须这样做”。 我喜欢Eric Lippert对此的看法:
所有的代码都是抽象的。 代码是“真正”做的是操纵数据吗? 号码? 位? 号电压? 电子号? 是的,但在电子层面理解代码是一个坏主意! 编码艺术正在弄清楚抽象的正确程度是什么给观众的。
在高级语言中,代码所做的事情(语义上)和代码如何完成它之间总是存在这种紧张关系。 维护程序员需要了解他们是否能够成功进行更改。
LINQ的重点在于它大量地强调了“如何”并大力强调“什么”。 通过使用查询理解,程序员正在对将来的观众说:“我相信你不应该知道也不关心这个结果集是如何计算的,但是你应该非常关心结果集的语义。” 他们使代码更接近正在实施的业务流程,远离实现业务流程的位和电子。
隐式类型化的本地人只是一个小方法,你可以忽略它的方式,从而强调什么。 在特定情况下做这件事是否正确是一个判断呼吁。 所以我告诉人们,如果知道这种类型的知识是相关的,而且它的选择对方法的持续运作至关重要,那么就不要使用隐式类型。 明确的打字说“我告诉你这是如何工作的,请注意”。 隐式类型说“这件事是List还是Customer []无关紧要,重要的是它是一群客户。”
就我个人而言,如果类型不明显,我就不倾向于使用它 - 我将LINQ查询纳入“合理明显”范围。 例如我不会为Directory.GetFiles
做这件事,因为它并不是真的很明显,它返回一个string[]
而不是(比如说)一个FileInfo[]
(或者其他的东西) - 这对你来说会产生很大的影响稍后再做。
如果在赋值运算符的右边有一个构造函数调用,那么我更有可能使用var
:显然这个类型会是什么。 这对于复杂的泛型类型尤其方便,例如Dictionary<string,List<int>>
。
我个人只在两个地方使用var:
即。 这是第2点的一个例子:
var names = new List<String>();
编辑 :这是为了回应Jon Skeet的问题。
上述答案实际上已经简化了。 基本上,我使用var的类型是:
在工厂方法的情况下,所有你需要知道的地方你写的代码是你回来的对象是某种类型的后代,并且某种类型有一个静态工厂方法,那么我会使用变种。 喜欢这个:
var connection = DatabaseConnection.CreateFromConnectionString("...");
上面的例子是我的代码的一个真实例子。 很明显,至少对于我和使用这些代码的人来说,该连接是一个DatabaseConnection后代,但确切的类型不需要理解代码,也不需要使用它。
链接地址: http://www.djcxy.com/p/53797.html