在c#3.0里允许我们这样定义变量
var age = 10;
var name = "james";
var time = DateTime.Now;
var books = new string[]{"aa","bb"};
但是也仅此而已,var只允许我们定义c#编译器通过上下文推断出类型的变量。
var x; // 错误,没有用来推断类型的初始化器
var y = { 1, 2, 3 }; // 错误,不允许使用集合初始化器
var z = null; // 错误,不允许出现空类型
像这样也是不允许的
var a= 10;
a= "james";
来看看隐私类型的IL实现。
c#2.0
.method public hidebysig instance void oldvar() cil managed
{
// 代码大小 8 (0x8)
.maxstack 1
.locals init ([0] string name)
IL_0000: nop
IL_0001: ldstr "james"
IL_0006: stloc.0
IL_0007: ret
} // end of method testvar::oldvar
c#3.0
.method public hidebysig instance void newvar() cil managed
{
// 代码大小 8 (0x8)
.maxstack 1
.locals init ([0] string name)
IL_0000: nop
IL_0001: ldstr "james"
IL_0006: stloc.0
IL_0007: ret
} // end of method testvar::newvar
完全一样。
我猜想var的出现其实完全是为了配合匿名类型而出现的。
Console.WriteLine(a.Name);
Console.WriteLine(a.Age);
在linq中应用也比较多
var queryLowNums =
from num in numbers
where num < 5
select num;
foreach (var s in queryLowNums)
{
Console.Write(s.ToString() + " ");
}
像这样的代码var age = 10;还是少写为好,一是类型安全,再是也为代码阅读尽量少造成障碍。