我一直聊天与我的同事的一天听到,他们的编码标明确禁止他们使用 var 关键词。他们不知道为什么这么和我总是发现隐含的宣言是令人难以置信的时非常有用的编码。我从来没有过任何问题,找出的是什么类型的变量(你只悬停的变量在VS你会得到那种方式)。

没有人知道为什么这将是一个坏主意使用var关键词在C#?

有帮助吗?

解决方案

.Net框架设计准则(真棒书)作家是2008年11月就出来了推荐使用var当Type是明显的,明确的考虑。

在另一方面,如果使用var将导致歧义阅读代码时,如安东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和禁止它。结果 这是一个耻辱,虽然,这就像在您的处置有一个很好的工具,但其保存在一个上锁的玻璃柜。

在大多数情况下,使用var简单类型实际上有助于可读性,我们决不能忘记,也有使用var没有性能损失。

其他提示

var q = GetQValue();

的确是一件坏事。然而,

var persistenceManager = ServiceLocator.Resolve<IPersistenceManager>();

是完全没什么问题。

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

作为一个旁注:我不知道他们怎么处理匿名类型时,不允许使用var关键字。或者不完全使用他们?

在大多数情况下,当使用的合理(即一个简单的类型初始化的类型和价值都是相同),那么它是好的。

有些时候它还不清楚,你已经破碎的东西通过改变它-主要是当初始化类型和(原)的变量类型是不同的,因为:

  • 可变原先的基类
  • 该变量的最初的一个接口
  • 可变原本是另一种类型与一种隐性转换操作员

在这些情况下,你可能遇到麻烦与任何类型的决议--例如:

  • 方法,具有不同的重载于两个相互竞争的类型
  • 扩展方法的定义不同于两个相互竞争的类型
  • 成员已重新宣布(藏)在一种类型
  • 一般类型推理会的工作方式不同
  • 运算符号决议将工作方式不同

在这种情况下,可改变的含义的代码,并执行不同的东西。然后,这是一件坏事。

实例:

隐性转换:

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

等等

当然这是一个错误。这是因为有些人没有意识到,它实际上是强类型的,而不是在所有像VB中的一个变种。

不是所有的企业编码标准是有意义的,我曾经为谁想要与公司名称前缀所有的类名称的公司。有一个巨大的返工时,该公司改变了它的名字。

首先,作为一般规则,编码标准,应该讨论并通过团队一致,并把它们背后的原因应该写下来,让任何人都能知道为什么他们在那里。他们不应该是圣讳从一台主机。

二,这个规则可能是合理的,因为代码多次读取不是书面var加快写作,但可以读慢一点。这显然不喜欢“总是初始化变量”,因为这两种选择(写入var和写作的类型)具有完全相同的行为守则的行为规则。因此,这不是一个重要的规则。我不会禁止var,我只想用“不想......”

我写博客的条关于这一主题几个月前。对我来说,我用它在那里每一个可能的和具体设计,我的Api周围的类推理。基本原因,我利用类型的推论是

  1. 它并不能减少种类型的安全
  2. 它实际上将会增加的类型安全代码,通过提醒你的隐性转换。最好的例子,在foreach
  3. 保持干燥的原则。这是专门为《宣言》的情况下,为什么还要说名字的两倍?
  4. 在某些情况下,它的平面出必需的。例匿名的类型
  5. 小打字没有损失的功能。

http://blogs.msdn.com/jaredpar/archive/2008/09/09/when-to-use-type-inference.aspx

var是最新的“如何布置您的括号” /匈牙利命名法/骆驼外壳辩论。没有正确的答案,但还有谁坐在极端的人。

您的朋友仅仅是不幸的,他们下面的极端分子的一个工作。

封禁它完全意味着禁止使用匿名类型(其成为你用LINQ更多非常有用的)。

这是愚蠢简单明了,除非有人能够形式化的好理由从不使用匿名类型。

如果它被滥用它可以伤害可读性。但是完全禁止它是一个有点奇怪的同事将使用匿名类型,而它有一个艰难的时间。

这是一个真正的可读性问题与您的代码。

我个人的偏好是永远只使用匿名类型“VAR”(事实上,如果你想在所有使用匿名类型,你需要使用VAR),而这些大多来自LINQ查询。在这种情况下,你没有选择,只能使用VAR如果您的查询被投射到一个新的(隐式和匿名的)类型。

然而,C#3.0将愉快地让你使用VAR您想要的位置,LINQ和匿名类型的外部,例如:

var myint = 0;
var mystring = "";

是完全有效的,和敏和MyString中将由用于初始化他们推断值强类型。 (因此,敏是一个System.Int32和MyString中是以System.String)。当然,它在寻找用于初始化什么类型的,他们将被隐式类型的变量的值时是相当明显的,但是,我认为这是即使对于代码的可读性更好,如果上面的方法写成:

int myint = 0;
string mystring = "";

,因为你可以一目了然立即查看哪一类型的那些变量。

考虑这有点混乱情形:

var aaa = 0;
double bbb = 0;

完全合法的代码(如果有点标新立异),但在上面的,我知道,BBB是双,尽管看似是一个int初始化值,但AAA肯定不会是双重的,而是一个int。

您可以考虑微软的观点是相关的,因为C#是他们的语言:

  

“不过,使用 VAR 确实有至少让你的代码更难理解其他开发人员的潜力。因此,C#的文档通常使用的 VAR 仅当需要“。

请参阅 MSDN - 隐式类型的局部变量(C#编程指南)时,最后一段。


您也应该知道, VAR 删除初始分配的编译时数据类型的测试。

var x = "mistake";     // error not found by compiler
int x = "mistake";     // error found

由于大多数变量只分配一次,持续使用的 VAR 消除了对变量赋值的几乎所有数据类型的测试。

此使代码容易受到意外更改例如那些通过合并工具或累开发制造。

隐式类型是伟大的,和人民谁平了禁止它破坏生产力,并邀请脆弱的代码。

这几乎就像类型安全,编译器核对鸭打字,重构时,这是非常有用的。举例来说,如果我有它返回一个列表的方法,我重构它的IEnumerable,那么任何调用者返回已使用var关键字,并且只使用IEnumerable的方法将被罚款的方法。如果我明确规定,例如,列表,那么我就到处去改变,要的IEnumerable

显然,如果任何隐式输入呼叫者的需要列表的方法,那么,我把我打造编译错误,但如果是这样的话我可能不应该已经改变返回类型呢。

埃里克利珀特 概括起来很好:

  • 使用var当你需要;当你用的是匿名类型。
  • 使用var当类型的声明是明显的初始化,尤其是如果它是一个对象的创造。这消除了冗余。
  • 考虑使用var如果代码强调的语义"的业务目标"的可变和淡化"机械"的详细信息的储存。
  • 使用明确的类型,如果这样做是必要的代码可以正确理解和维护。
  • 使用描述性的变量名称,不论是否使用"var".变量名称中应该表示的语义学的变量,而不详细信息的储存;"decimalRate"是坏;"利率"是良好的。

我自己的意见:我发现它难以读一点毫无意义的类型,例如 int, string, bool 甚至一个 User.这是关于可读性后所有的(除了在那里使用它与皇宫),所以当瓦尔被飞溅的关于它可能会更难于阅读和击败的目的关键词语言设计师们用它。

新闻部的宣言冗余部 (从杰夫的 编码恐怖):

"我用隐含可变输入 无论何时何地,它使我的代码 更加简洁。任何删除 冗余从我们的代码应 积极的寻求--和 其中包括交换的语言。"

我自己觉得 值得考虑有关,但是建立一个全面的准则时使用或不会 矫枉过正.

我有例(当我通过Table.Rows集合FOREACH)使用VAR导致一些基类,而不是实际的DataRow类型的类型时。这是我曾与VAR麻烦之时。

<强> '变种' 是关于是清楚

关于是否使用var关键字或不主要的争论是关于代码是如何可读是给自己和其他开发者。

就像你写一个故事没有明确的正确答案。但是,让我们来看看在纯英文的一些例子。

  

杰克比尔说你好。他不喜欢他,所以他转身走了另一条路。

谁去的其他方式?杰克和比尔?在这种情况下,“杰克”和“条例”都喜欢的类型名称。而“他”和“他”都像var关键字。在这种情况下,它可能有助于更具体。例如,以下是更清晰。

  

杰克比尔说你好。杰克没有像比尔所以他转身走了另一条路。

在这种情况下是更具体提出的句子清楚。但是这并不总是将是如此。在一些情况下是特定使得它更难阅读。

  

比尔喜欢的书,所以比尔去图书馆和比尔拿出一本书,比尔总是喜欢。

在这种情况下,它会更容易阅读的句子如果我们使用“他”,并在离开他的名字一起某些情况下,这是一个使用var关键字是等价的。

  

比尔喜欢的书,所以他去了图书馆,拿出一本书,他一直很喜欢。

这些类比覆盖的要点,但他们不告诉整个故事。见这些例子只有一个指代人的方式。无论是与他们的名字,比如比尔,或者更一般的方式,像“他”和“他”。但是我们现在只用一个词的工作。

在码的情况下有两个“单词”,的类型和变量名。

Person p = GetPerson();

现在变成现在的问题是没有足够的信息,那里您可以轻松地确定哪些p是什么?你还会知道什么人是这样的情景:

var p = GetPerson();

这个怎么样:

var p = Get();

这个怎么样:

var person = Get();

或者这一个:

var t = GetPerson();

或者这一个:

var u = Person.Get();

关键字var无论是在给定的情况下工作取决于代码的情况下很多,像什么的变量,类和方法的名称,以及该代码的复杂性。

我个人喜欢用var关键字它更全面的为。但我也倾向于类型来命名我的变量,所以我真的不丢失任何信息。

这有时会说我做例外,比如是什么复杂的性质,而软件是什么,如果不是复杂的。

下面是一个试验我上var与显式类型的效率运行的结果:

  private void btnVar_Click(object sender, EventArgs e)
    {
        Stopwatch obj = new Stopwatch();
        obj.Start();
        var test = "Test";
        test.GetType();
        obj.Stop();
        lblResults.Text = obj.Elapsed.ToString();
    }

    private void btnString_Click(object sender, EventArgs e)
    {
        Stopwatch obj = new Stopwatch();
        obj.Start();
        string test = "Test";
        obj.Stop();
        lblResults.Text = obj.Elapsed.ToString();

    }

首先标签的结果是:00:00:00 000034

第二标签的结果是:00:00:00 00008

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top