【IT168技术文档】
在c#3.0里允许我们这样定义变量
但是也仅此而已,var只允许我们定义c#编译器通过上下文推断出类型的变量。var age = 10; var name = "james"; var time = DateTime.Now; var books = new string[]{"aa","bb"};
来看看隐私类型的IL实现。var x; // 错误,没有用来推断类型的初始化器 var y = { 1, 2, 3 }; // 错误,不允许使用集合初始化器 var z = null; // 错误,不允许出现空类型 像这样也是不允许的 var a= 10; a= "james";
c#2.0
c#3.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
完全一样。.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的出现其实完全是为了配合匿名类型而出现的。
在linq中应用也比较多var a = new { Name = "james" ,Age = 25}; Console.WriteLine(a.Name); Console.WriteLine(a.Age);
也就是说对象是匿名类型,或者对象是难以预测的类型的时候。int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var queryLowNums = from num in numbers where num < 5 select num; foreach (var s in queryLowNums) { Console.Write(s.ToString() + " "); }
像这样的代码var age = 10;还是少写为好,一是类型安全,再是也为代码阅读尽量少造成障碍。