C#3.0 为我们带来什么(4) —— 具有隐式类型的局部变量var

文/tianyamoon  出处/博客园

在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的出现其实完全是为了配合匿名类型而出现的。

            var a = new { Name = "james" ,Age = 25};
            Console.WriteLine(a.Name);
            Console.WriteLine(a.Age);
在linq中应用也比较多

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;还是少写为好,一是类型安全,再是也为代码阅读尽量少造成障碍。

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [C#] 的这些文章也感兴趣:

C#积木模块ABC(四)
VisualC#的菜单编程
C#3.0 为我们带来什么(3) —— 初始化器
基于C#的接口基础教程之五(4)
利用VisualC#开发一个媒体播放器
C#下实现动态系统托盘图标
用C#编写ActiveX控件(三)
C#数学运算类
VisualStudio.Net内幕(8)
C#弹出窗口杀手