Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么var是一件坏事?_C#_Coding Style_Implicit Typing - Fatal编程技术网

C# 为什么var是一件坏事?

C# 为什么var是一件坏事?,c#,coding-style,implicit-typing,C#,Coding Style,Implicit Typing,前几天我和同事聊天,听说他们的编码标准明确禁止他们在C#中使用var关键字。他们不知道为什么会这样,我总是发现隐式声明在编码时非常有用。我在找出变量的类型时从来没有遇到过任何问题(您只需将鼠标悬停在VS中的变量上,就可以得到该类型) 有人知道为什么在C#中使用var关键字是个坏主意吗?这肯定是个错误。这是因为有些人没有意识到它实际上是强类型的,根本不像VB中的变量 并不是所有的公司编码标准都有意义,我曾经为一家公司工作过,他想在所有类名前加上公司名。公司更名时进行了大量的修改。如果它被误用,可能

前几天我和同事聊天,听说他们的编码标准明确禁止他们在C#中使用
var
关键字。他们不知道为什么会这样,我总是发现隐式声明在编码时非常有用。我在找出变量的类型时从来没有遇到过任何问题(您只需将鼠标悬停在VS中的变量上,就可以得到该类型)


有人知道为什么在C#中使用var关键字是个坏主意吗?

这肯定是个错误。这是因为有些人没有意识到它实际上是强类型的,根本不像VB中的变量


并不是所有的公司编码标准都有意义,我曾经为一家公司工作过,他想在所有类名前加上公司名。公司更名时进行了大量的修改。

如果它被误用,可能会损害可读性。然而,完全禁止它有点奇怪,因为如果没有它,您的同事将很难使用匿名类型

var q = GetQValue();
这确实是一件坏事。但是,

var persistenceManager = ServiceLocator.Resolve<IPersistenceManager>();
var persistenceManager=ServiceLocator.Resolve();
对我来说很好

底线是:使用描述性的标识符名称,你会相处得很好


作为旁注:我想知道当不允许使用
var
关键字时,它们如何处理匿名类型。或者他们不完全使用它们?

var
是最新的“如何布置大括号”/“匈牙利符号/骆驼壳”辩论。没有正确的答案,但有些人坐在极端


你的朋友很不幸,他们在一个极端分子下面工作。

完全禁止这意味着禁止使用匿名类型(随着你越来越多地使用LINQ,匿名类型变得非常有用)

除非有人能正式提出一个不使用匿名类型的好理由,否则这是愚蠢的简单明了。

2008年11月出版的(很棒的书)的作者建议在类型明显且明确时考虑使用
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
var name=new List();//var的良好使用
字符串source=GetSource();
var tokens=source.Split(“”);//好啊大多数开发人员都知道String.Split
var id=GetId();//可能不太好;目前还不清楚身份证的类型
有可能,为了确保可读性不受低级开发人员的突发奇想的影响,您的组织决定您不值得使用
var
,并将其禁用。
这是一个遗憾,虽然,这就像有一个很好的工具在您的处置,但保持在一个锁的玻璃柜


在大多数情况下,对简单类型使用
var
实际上有助于可读性,而且我们不能忘记,在大多数情况下,当明智地使用
var

时(即,类型和值相同的简单类型初始值设定项),使用
var也不会对性能造成任何影响,这样做很好

有些时候,不清楚您是否通过更改来破坏了它-主要是当初始化类型和(原始)变量类型不相同时,因为:

  • 该变量最初是基类
  • 该变量最初是一个接口
  • 该变量最初是另一种类型,带有隐式转换运算符
在这些情况下,您可能会遇到任何类型解析的问题,例如:

var myint = 0;
var mystring = "";
  • 对两种竞争类型具有不同重载的方法
  • 为两种竞争类型定义不同的扩展方法
  • 已在其中一个类型上重新声明(隐藏)的成员
  • 泛型类型推断的工作方式不同
  • 操作员分辨率将以不同的方式工作
在这种情况下,您可以更改代码的含义,并执行不同的操作。这是一件坏事

示例:

隐式转换:

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(); }
方法隐藏:

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(); }
}

etc

首先,作为一般规则,编码标准应由团队讨论并达成一致,并将其背后的理由写下来,以便任何人都能知道它们存在的原因。它们不应该是来自一位大师的神圣真理


其次,这条规则可能是合理的,因为代码的读取次数比写入次数多<代码>变量
加快了写入速度,但可能会稍微降低读取速度。这显然不是像“始终初始化变量”这样的代码行为规则,因为两个选项(写入
var
和写入类型)具有完全相同的行为。所以这不是一条重要的规则。我不会禁止
var
,我只会使用“preference…”

这确实是代码的可读性问题

我个人的偏好是只对匿名类型使用“var”(事实上,如果你想使用匿名类型,你需要使用var),而这些大多来自LINQ查询。在这些情况下,如果查询投影到一个新的(隐式&匿名)类型,那么您别无选择,只能使用var

然而,C#3.0很乐意让您在LINQ和匿名类型之外的任何地方使用var,例如:

var myint = 0;
var mystring = "";
是完全有效的,myint和mystring将由用于初始化它们的推断值强类型化。(因此,myint是System.Int32,mystring是System.String)。当然,当查看用于初始化变量的值时,很明显它们将被隐式类型化为什么类型,但是,我认为如果将上述内容编写为:

int myint = 0;
string mystring = "";
因为你一眼就能看出这些变量是什么类型的

考虑一下这个有点令人困惑的场景:

var aaa = 0;
double bbb = 0;
var p = GetPerson();
完全有效的代码(如果有点非常规),但在abo中
Person p = GetPerson();
var p = GetPerson();
var p = Get();
var person = Get();
var t = GetPerson();
var u = Person.Get();