我应该*总是*支持 C# 3.0 中的隐式类型局部变量吗?
Posted
技术标签:
【中文标题】我应该*总是*支持 C# 3.0 中的隐式类型局部变量吗?【英文标题】:Should I *always* favour implictly typed local variables in C# 3.0? 【发布时间】:2010-09-06 05:34:31 【问题描述】:Resharper 肯定是这么认为的,而且开箱即用它会催促你转换
Dooberry dooberry = new Dooberry();
到
var dooberry = new Dooberry();
这真的被认为是最好的风格吗?
【问题讨论】:
mmmmm...杜贝瑞..好吃! 【参考方案1】:这当然是风格问题,但我同意 Dare:C# 3.0 Implicit Type Declarations: To var or not to var?。我认为使用 var 而不是显式类型会使您的代码可读性降低。在以下代码中:
var result = GetUserID();
什么是结果?一个int,一个字符串,一个GUID?是的,这很重要,不,我不应该通过挖掘代码来知道。在代码示例中尤其烦人。
Jeff 就此写了一篇帖子,称he favors var。但是那家伙疯了!
我看到了 *** 成功的一种模式:挖掘旧的 CodingHorror 帖子并(危险风格)用问题来表达它们。
【讨论】:
为什么不修正变量名而不是抱怨var呢? var userID = GetUserID(); userID 是 string 还是 int 其实不是很重要,它是用来识别用户的,应该被相关函数接受。【参考方案2】:我只在很明显 var 是什么时才使用它。
我很清楚:
XmlNodeList itemList = rssNode.SelectNodes("item");
var rssItems = new RssItem[itemList.Count];
我不清楚:
var itemList = rssNode.SelectNodes("item");
var rssItems = new RssItem[itemList.Count];
【讨论】:
【参考方案3】:我看到的答案的最佳总结是Eric Lippert's comment,它本质上是说如果类型很重要,您应该使用具体类型,否则不要使用。本质上,类型信息应该保留给类型很重要的地方。
我公司的标准是在任何地方都使用 var,这是我们在 reading various recommendations and then spending some time trying it out to see whether the lack of annotated type information was a help or a hindrance 之后提出的。我们觉得这是一种帮助。
人们所链接的大多数建议(例如 Dare 的建议)都是由从未尝试过使用 var 而不是具体类型进行编码的人提出的建议。这使得这些建议几乎毫无价值,因为它们不是根据经验说话,它们只是在推断。
我能给你的最好建议是亲自尝试一下,看看什么对你和你的团队有用。
【讨论】:
【参考方案4】:@jongalloway - var 不一定会让你的代码更难读。
var myvariable = DateTime.Now
DateTime myvariable = DateTime.Now;
第一个和第二个一样可读并且需要更少的工作
var myvariable = ResultFromMethod();
在这里,您有一点, var 可能会使代码的可读性降低。我喜欢 var,因为如果我将小数更改为双精度,我不必在一堆地方更改它(不要说重构,有时我会忘记,让我 var!)
编辑:刚刚阅读了这篇文章,我同意。哈哈。
【讨论】:
【参考方案5】:对此@Coding Horror进行了很好的讨论
我个人尽量减少使用它,我发现它会损害可读性,尤其是在从方法调用中分配变量时。
【讨论】:
【参考方案6】:我感觉随着时间的推移,这将成为 Stack Overflow 上最受欢迎的问题之一。它归结为偏好。无论您认为什么都更具可读性。当类型定义在右侧时,我更喜欢 var,因为它更简洁。当我从方法调用中分配变量时,我使用显式类型声明。
【讨论】:
【参考方案7】:只有在你事先不知道类型时才有意义。
【讨论】:
【参考方案8】:在C# 9.0
中有一种通过Target-typed new expressions 初始化类的新方法。
你可以这样初始化类:
Dooberry dooberry = new();
就我个人而言,我更喜欢它而不是使用 var
,而且它对我来说更具可读性。
关于调用方法,我认为这取决于您。就个人而言,我更喜欢指定类型,因为我认为这样更具可读性:
Dooberry dooberry = GetDooberry();
在某些情况下,很清楚类型是什么,在这种情况下,我使用var:
var now = DateTime.Now;
【讨论】:
【参考方案9】:像 ReSharper 这样的工具的优点之一是,您可以随心所欲地编写代码,然后将其重新格式化为更易于维护的格式。我将 R# 设置为始终重新格式化,以便实际使用的类型可见,但是,在编写代码时,我几乎总是输入“var”。
好的工具让你两全其美。
约翰。
【讨论】:
【参考方案10】:“最佳风格”是主观的,因上下文而异。
有时使用 'var' 比输入一些很长的类名更容易,或者如果您不确定给定函数的返回类型。我发现我在使用 Linq 或 for 循环声明时更多地使用 'var'。
其他时候,使用完整的类名更有帮助,因为它比 'var' 更好地记录代码。
我觉得应该由开发者来做决定。没有银弹。没有“一种真正的方式”。
干杯!
【讨论】:
【参考方案11】:我看到了 *** 的模式 成功:挖掘旧的 CodingHorror 帖子 和(危险风格)用 问题的术语。
我认罪!不过你说得对,这似乎是一个比较流行的小问题。
【讨论】:
【参考方案12】:关于这个主题有一个really good MSDN article,它概述了一些你不能使用 var 的情况:
以下限制适用于隐式类型变量声明:
var 只能在声明和初始化局部变量时使用 在同一份声明中;变量 不能初始化为 null 或 方法组或匿名函数。 var 不能用于类范围内的字段。 使用var声明的变量不能在初始化中使用 表达。换句话说,这 表达式是合法的: int i = (i = 20); 但是这个表达式会产生一个 编译时错误:var i = (i = 20); 多个隐式类型的变量不能在同一个中初始化 声明。 如果名为 var 的类型在范围内,则 var 关键字将解析为 该类型名称,不会被处理 作为隐式类型本地的一部分 变量声明。
我建议您检查一下以了解在代码中使用 var 的全部含义。
【讨论】:
【参考方案13】:不,不是总是,但我会说很多时候。类型声明并不比匈牙利符号有用得多。您仍然有相同的问题,即类型可能会更改,并且重构工具很有帮助,因为与不必更改指定类型的位置(除了在单个位置之外)相比,它并不理想,这遵循不要重复自己原则。
任何可以为变量及其值指定类型名称的单行语句都应该使用 var,尤其是当它很长时 Generic<OtherGeneric< T,U,V>, Dictionary< X, Y>>>
【讨论】:
以上是关于我应该*总是*支持 C# 3.0 中的隐式类型局部变量吗?的主要内容,如果未能解决你的问题,请参考以下文章