Spo*_*ike 48 c# coding-style implicit-typing
前几天我和同事聊天,听说他们的编码标准明确禁止他们var在C#中使用关键字.他们不知道为什么会如此,我总是发现隐式声明在编码时非常有用.我从来没有遇到任何问题,找出变量是什么类型(你只是将鼠标悬停在VS中的变量上,你会得到那种方式).
有谁知道为什么在C#中使用var关键字是个坏主意?
Ren*_*uis 64
2008年11月发布的.Net框架设计指南(精彩的书籍)的作者建议考虑var在类型明显且明确的时候使用.
另一方面,如果使用var会在阅读代码时导致歧义,正如Anton Gogolev指出的那样,那么最好不要使用它.
在书中(附件A),他们实际上给出了这个例子:
var names = new List<string>(); // good usage of var
string source = GetSource();
var tokens = source.Split(' '); // ok; most developers know String.Split
var id = GetId(); // Probably not good; it's not clear what the type of id is
Run Code Online (Sandbox Code Playgroud)
为了确保可读性不受低级开发人员的影响,您的组织可能已经决定您不值得var并禁止它.
但这很遗憾,它就像拥有一个漂亮的工具,但保存在一个锁着的玻璃柜中.
在大多数情况下,使用var简单类型实际上有助于提高可读性,我们不能忘记使用时也没有性能损失var.
Ant*_*lev 33
var q = GetQValue();
Run Code Online (Sandbox Code Playgroud)
确实是一件坏事.然而,
var persistenceManager = ServiceLocator.Resolve<IPersistenceManager>();
Run Code Online (Sandbox Code Playgroud)
对我来说完全没问题.
底线是:使用描述性标识符名称,你会相处得很好.
作为旁注:我不知道如果不允许使用var关键字,他们如何处理匿名类型.或者他们不完全使用它们?
Mar*_*ell 19
在大多数情况下,当合理使用时(即类型和值相同的简单类型初始化器),那就没问题了.
有些时候不清楚你是否通过改变来破坏它 - 主要是,当初始化类型和(原始)变量类型不相同时,因为:
在这些情况下,您可能会遇到任何类型分辨率的问题 - 例如:
在这种情况下,您可以更改代码的含义,并执行不同的操作.这是一件坏事.
例子:
隐式转换:
static void Main() {
long x = 17;
Foo(x);
var y = 17;
Foo(y); // boom
}
static void Foo(long value)
{ Console.WriteLine(value); }
static void Foo(int value) {
throw new NotImplementedException(); }
Run Code Online (Sandbox Code Playgroud)
方法隐藏:
static void Main() {
Foo x = new Bar();
x.Go();
var y = new Bar();
y.Go(); // boom
}
class Foo {
public void Go() { Console.WriteLine("Hi"); }
}
class Bar : Foo {
public new void Go() { throw new NotImplementedException(); }
}
Run Code Online (Sandbox Code Playgroud)
等等
Nee*_*ack 17
当然这是一个错误.这是因为有些人并没有意识到它实际上是强类型的,而且根本不像VB中的var.
并非所有的公司编码标准都有意义,我曾经为一家想要在公司名称前加上所有类名称的公司工作过.当公司改名时,进行了大规模的返工.
小智 11
您可能认为 Microsoft 的观点是相关的,因为 C# 是他们的语言:
“但是,使用var确实至少有可能使其他开发人员更难以理解您的代码。因此,C# 文档通常仅在需要时才使用var 。”
请参阅MSDN - 隐式类型局部变量(C# 编程指南),最后一段。
您还应该注意var删除了对初始赋值的编译时数据类型测试。
var x = "mistake"; // error not found by compiler
int x = "mistake"; // error found
Run Code Online (Sandbox Code Playgroud)
由于大多数变量仅分配一次,因此一致使用var几乎消除了对变量分配的所有数据类型测试。
这使得您的代码容易受到意外更改的影响,例如合并工具或疲惫的开发人员所做的更改。
首先,作为一般规则,编码标准应该由团队讨论和同意,并且应该写下他们背后的推理,以便任何人都可以知道他们为什么在那里.他们不应该是一位大师的圣洁真理.
其次,这个规则可能是合理的,因为代码读取次数多于写入次数.var加快写作速度,但可能会减慢读数速度.它显然不是像"始终初始化变量"这样的代码行为规则,因为两种选择(写入var和写入类型)具有完全相同的行为.所以这不是一个关键的规则.我不会禁止var,我会使用"首选..."
几个月前我写了一篇关于这个主题的博客文章.对我来说,我尽可能地使用它,并专门围绕类型推断设计我的API.我使用类型推断的基本原因是
http://blogs.msdn.com/jaredpar/archive/2008/09/09/when-to-use-type-inference.aspx
用简单的英语理解“var”
我将向您展示使用 AND 不使用 'var' 是为了清楚地沟通。
我将展示使用 'var' 使代码更易于阅读的情况的示例,而使用 var 时的其他示例使事情变得难以理解。
不仅如此,您还会看到“var”的清晰程度很大程度上取决于您对代码中其他所有内容的命名。
拿这个例子:
杰克向比尔问好。他不喜欢他,所以他转身走另一条路。
谁走了另一条路?杰克还是比尔?在这种情况下,“Jake”和“Bill”就像类型名称。“他”和“他”就像 var 关键字。在这种情况下,更具体一些可能会有所帮助。下面的例子就清楚多了。
杰克向比尔问好。杰克不喜欢比尔,所以他转身走另一条路。
在这种情况下,更具体使句子更清晰。但情况并非总是如此。在某些情况下,具体会使阅读变得更加困难。
比尔喜欢书,所以比尔去了图书馆,比尔拿出了一本比尔一直喜欢的书。
在这种情况下,如果我们使用“他”并且在某些情况下将他的名字一起省略,则句子会更容易阅读,这相当于使用var关键字。
比尔喜欢书,所以他去图书馆拿出了一本他一直喜欢的书。
这些类比涵盖了要点,但并没有说明整个故事。在这些例子中,只有一种方式来指代这个人。要么用他们的名字,例如比尔,要么用更一般的方式,比如“他”和“他”。但我们只用一个词。
在代码的情况下,您有两个“词”,类型和变量名称。
Person p = GetPerson();
Run Code Online (Sandbox Code Playgroud)
现在的问题是是否有足够的信息让您轻松确定是什么p?你还会知道在这种情况下人们是什么吗:
var p = GetPerson();
Run Code Online (Sandbox Code Playgroud)
这个怎么样:
var p = Get();
Run Code Online (Sandbox Code Playgroud)
这个怎么样:
var person = Get();
Run Code Online (Sandbox Code Playgroud)
或者这个:
var t = GetPerson();
Run Code Online (Sandbox Code Playgroud)
或者这个:
var u = Person.Get();
Run Code Online (Sandbox Code Playgroud)
关键字var在给定场景中是否有效在很大程度上取决于代码的上下文,例如变量、类和方法的名称,以及代码的复杂性。
我个人喜欢使用var对我来说更全面的关键字。但我也倾向于在类型后命名我的变量,所以我不会真正丢失任何信息。
也就是说,有时我会例外,这就是任何复杂事物的本质,软件即使不复杂也算不了什么。