为什么不到处使用var?

时间:2011-05-10 14:55:34

标签: c#-4.0 var

除了非人类可读代码之外还有另一个原因是不对函数中的每个变量使用var吗?我的意思是性能命中不是使用int,SqlCommand,string而是使用var而不是?

5 个答案:

答案 0 :(得分:16)

  

使用或不使用“var”   不会改变其他可观察的   该计划的特点,如此   作为其表现。

     

问题   是否使用“var”铰链   它对人类读者的影响   和代码的维护者,而不是   它对编制的人工制品的影响。

Hava看看这篇优秀的文章:http://blogs.msdn.com/b/ericlippert/archive/2011/04/20/uses-and-misuses-of-implicit-typing.aspx

答案 1 :(得分:7)

这绝对不是性能打击。 var实际上不是一个类型,而是代码中的占位符,这意味着“我不想写出这个变量的类型。”实际上,如果将鼠标悬停在Visual Studio中的文本上,它将显示一个工具提示,指出您确定的类型太长而无法写入!

但是,严格来说,一般情况下,你应该在清楚代码的类型时使用var,这样其他人在阅读时就不会混淆。

答案 2 :(得分:6)

是的,到处使用var

我爱var。它为我节省了大量的击键次数。它帮助我以“先用”的方式编写代码,并使重构变得更强大。

命名的类型无关紧要。 Intellisense告诉我类型可以做什么,这一切都很重要。

即使我知道类型名称,如果intellisense被破坏也不会对我有多大帮助,因为我不一定只知道类型名称中的特定方法或属性是什么。

var使事情变得更好的一些细节:

  • 调用方法(不知道它返回什么 - 特别是如果它是泛型类型)

这个很大。我经常不记得方法返回什么,但我知道该方法的名称。不得不把退出的类型拉出我的头,这让我失望了。我只是写var,用我的输入调用方法,并且voila intellisense告诉我返回类型是什么以及我可以用它做什么。

// Imagine a method that creates a return type that gets some generic type from the call arguments
Tuple<TA,TB,TC,TD,TE> Combine<TA,TB,TC,TD,TE>(TA a, TB b, TC c, TD d, TE e);

// GOOD: Call this with var
var combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");

// BAD: Without var
Tuple<string, int, bool, Dictionary<int, List<string>>, string> combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");
  • 重构返回类型

如果我使用var,编译器会立即告诉我该类型被滥用的地方(可能新的返回类型没有相同的属性名称)。

如果我没有使用var,我只会收到有关未能分配类型的错误。然后,我必须将该类型更改为新类型(它被调用的每个地方)然后我最终得到警告,其中该类型被错误地使用。

  • 专注于命名变量,而不是重新输入类型名称。

var是C#发生过的最好的事情之一。

// BAD: No var
Dictionary<int,List<Tuple<int,bool,string>>> ahhhhThatWasDifficult = new Dictionary<int,List<Tuple<int,bool,string>>>();

// GOOD: With var
// I can think of a good name before writing this complex type
var validNameCountDictionary = new Dictionary<int,List<Tuple<int,bool,string>>>();

如果我仍然没有说服你,那么如果你想使用它,你别无选择:

  • 匿名类型
  • LINQ的

那么,为什么不一直走到任何地方使用var

我知道这很晦涩难懂,但我有时甚至会这样做,所以我总是可以使用var并对我的代码保持一致:

var number = (int?) null;

因为我喜欢var。

P.S。我很遗憾let正在替换Typescript / ES6中的var,但Javasctipt var!== C#var

答案 3 :(得分:0)

在少数情况下,偶尔在您获取变量值的同时不声明变量。因此var无法在这些情况下有效使用。

示例-调用仅根据传递给它的对象类型起作用的方法。

Derived d = null; // there is nothing to infer the type from
var someInfo = GetInfo(d);

...

// Base is an ancestor of Derived    
Info GetInfo(Base b)
{
   if (b is Derived) return ...;
   if (b is Derived2) return ...;
   ...
}

也许您可以替代:

var d = default(Derived);

var d = (Derived)null;

,但是更具可读性的IMO都没有。我不会仅仅为了使用var而这样做。

答案 4 :(得分:-11)

关于implicit and explicit typing。 C#.NET是一种类型语言,这意味着您可以定义内存中存储的数据类型。如果您没有定义它,则会使某些操作不那么安全,因此您希望尽可能明确地键入。但是在某些情况下,类型在您的代码中非常明显,因此您可以将其留给编译器来确定变量应该是什么类型,即implicit typing

没有类型的问题是在内存中,本质上是一堆1和0这个数据可能意味着什么,所以如果你最初在位置000001放入一个整数然后尝试将其读作Cat(想象一下那种类型的东西,那么你刚刚从记忆中读出来的东西都没什么意义。所以这就是发明类型系统的原因,告诉你你在哪里存储的数据,并确保你以一种人类可以再次理解的方式读取数据,就像它不是真正的机器一样。在一天结束时,数据是什么。