为什么不到处使用var?

Dom*_*ing 7 var c#-4.0

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

man*_*lds 16

使用或不使用"var"不会改变程序的其他可观察特征,例如其性能.

是否使用"var"的问题取决于它对代码的人类读者和维护者的影响,而不取决于它对编译的人工制品的影响.

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


dle*_*lev 7

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

但是,严格来说,一般情况下,当代码清楚地显示类型是什么时,通常应该使用var,以便其他人在阅读时不会混淆.


Ric*_*ove 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");
Run Code Online (Sandbox Code Playgroud)
  • 重构返回类型

如果我使用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>>>();
Run Code Online (Sandbox Code Playgroud)

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

  • 匿名类型
  • LINQ

所以,为什么不一直走到var各处使用.

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

var number = (int?) null;
Run Code Online (Sandbox Code Playgroud)

因为我爱var.

PS我有点伤心,let正在替换varTypescript/ES6,但Javasctipt var!== C#var


Ton*_*ion -18

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

没有类型的一个问题是,在内存中,本质上是一堆 1 和 0,这些数据可能意味着任何东西,所以如果你最初在位置 000001 处放入一个整数,然后尝试将其读取为 Cat (想象一下是某种类型),那么你刚刚从记忆中读出的内容就没有多大意义了。这就是类型系统被发明的原因,它告诉你什么数据存储在哪里,并确保你以人类可以再次理解的方式读回数据,而对于机器来说,它并不真正如此。归根结底,数据是什么很重要。

  • 请注意,“var”并没有消除类型。它只会让编译器为您选择正确的类型。如果你说 `var foo = bar()`,那么 `foo` 仍然会是严格类型的,只是你不需要输入类型。(双关语不是有意的,但已注意到。) (16认同)
  • 从存储和类型安全的角度来看,“var”与显式类型“完全相同”。有些操作“不太安全”是什么意思? (4认同)
  • 这个答案对于 var 的工作原理具有极大的误导性。 (4认同)