2010-11-29 117 views

回答

128

这意味着宣布本地存在的类型将由编译器推断:

// This statement: 
var foo = "bar"; 
// Is equivalent to this statement: 
string foo = "bar"; 

值得注意的是,var没有定义的变量为动态类型。因此,这是不合法的:

var foo = "bar"; 
foo = 1; // Compiler error, the foo variable holds strings, not ints 

var只有两个用途:

  1. 它需要较少的打字声明变量,变量声明为嵌套泛型类型时尤其如此。
  2. 必须存储到一个匿名类型的对象的引用时使用,因为类型名称不能提前知道:var foo = new { Bar = "bar" };

不能使用var作为任何东西,但当地人的类型。因此,您不能使用关键字var来声明字段/属性/参数/返回类型。

+1

这是一个很好的例子,说明Stack Exchange上需要的答案。有时候人们会忽略重要的信息和/或不够简短。 – Panzercrisis 2016-04-12 14:03:37

12

这意味着数据类型是从上下文派生(暗示)的。

http://msdn.microsoft.com/en-us/library/bb383973.aspx

在于在方法范围中声明可以 具有隐式类型变种的Visual C#3.0,变量 开始。一个 隐式类型局部变量是 强类型,就好像您自己已经声明了 类型,但 编译器确定类型。 i的 以下两个声明是 功能上等同的:

var i = 10; // implicitly typed 
int i = 10; //explicitly typed 

var是用于消除键盘打字和视觉噪声,例如有用,

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName(); 

变得

var x = new MyReallyReallyLongClassName(); 

但可以被滥用到可读性被牺牲的地步。

7

“var”表示编译器将根据使用情况确定变量的显式类型。例如,

var myVar = new Connection(); 

会给你一个Connection类型的变量。

3

你有没有讨厌写这样的变量初始值设定项?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int)) 

所以,从C#3.0,你可以用

var xmlSerializer = new XmlSerialzer(typeof(int)) 

一个通知更换:编译时类型得到解决,所以其性能没有问题。但编译器应该能够在构建步骤中检测类型,所以像var xmlSerializer;这样的代码根本不会编译。

4

它根据在初始化中分配给它的内容来声明一个类型。

一个简单的例子是,代码:

var i = 53; 

将审查53的类型,基本上是重写此为:

int i = 53; 

请注意,虽然我们可以有:

long i = 53; 

这不会发生在var。尽管它可以用:

var i = 53l; // i is now a long 

同理:

var i = null; // not allowed as type can't be inferred. 
var j = (string) null; // allowed as the expression (string) null has both type and value. 

这可能是一个小的便利与复杂类型。它与匿名类型更为重要:

var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name}; 
foreach(var j in i) 
    Console.WriteLine(j.ID.ToString() + ":" + j.Name); 

在这里有定义ij比使用var,因为是他们持有的类型没有名字,没有其他办法。