在C#中“var”是什么意思?
可能重复:
在C#中使用var关键字
在C#中,关键字“ var ”是如何工作的?
这意味着被声明的本地types将被编译器推断出来:
// This statement: var foo = "bar"; // Is equivalent to this statement: string foo = "bar";
值得注意的是, var
不会将variables定义为dynamictypes。 所以这是不合法的:
var foo = "bar"; foo = 1; // Compiler error, the foo variable holds strings, not ints
var
只有两个用途:
- 它需要更less的键入来声明variables,特别是当声明variables为嵌套genericstypes时。
- 当存储对匿名types的对象的引用时,必须使用它,因为types名称不能预先知道:
var foo = new { Bar = "bar" };
你不能使用var
作为任何东西,除了当地人的types。 所以你不能使用关键字var
来声明字段/属性/参数/返回types。
这意味着数据types是从上下文派生(暗示)的。
从http://msdn.microsoft.com/en-us/library/bb383973.aspx
从Visual C#3.0开始,在方法范围声明的variables可以有一个隐式typesvar。 一个隐式types的局部variables是强types的,就像你自己声明了types一样,但编译器决定了types。 以下两个声明在function上是等价的:
var i = 10; // implicitly typed int i = 10; //explicitly typed
var
用于消除键盘input和视觉噪声,例如,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
变
var x = new MyReallyReallyLongClassName();
但可以被滥用到可读性被牺牲的地步。
“var”表示编译器将根据使用情况确定variables的显式types。 例如,
var myVar = new Connection();
会给你一个Connectiontypes的variables。
它在初始化时根据分配的内容来声明一个types。
一个简单的例子是代码:
var i = 53;
将检查53的types,基本上将其重写为:
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.
对于复杂的types,这可能是一个小小的方便。 匿名types更重要:
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);
这里没有其他的方法来定义i
和j
比使用var
因为没有他们持有的types的名字。
你有没有讨厌写这样的variables初始值设定项?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
所以,从C#3.0开始,你可以用它replace它
var xmlSerializer = new XmlSerialzer(typeof(int))
一个通知:types在编译期间解决,所以没有性能问题。 但编译器应该能够在构build步骤中检测types,所以代码如var xmlSerializer;
根本不会编译。