var:弱化类型的定义。对于我这种菜鸟来说,很多时候不知道对象需要什么类型的时候,直接一var就o了。因为它能指示编译器根据初始化语句右侧的表达式推断变量的类型。其推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework 类库中定义的类型或任何表达式。
《C#高级编程第七版》中在讲到泛型的类型安全的时候,用了下面一个例子:
在一ArrayList类型的集合中添加一个整数、一个字符串和一个MyClass类型的对象; ArrayList list = new ArrayList(); List.Add(44); List.Add("mystring"); List.Add(new MyClass());
现在需要遍历集合中所有的元素。如果集合使用foreach进行迭代,而该foreach语句使用整数元素进行迭代,编译器会编译这段代码,但是会出现运行异常:因为集合中的元素并不能全部强制转换成int,
foreach( int i in list) { Console.WriteLine(i); }
那么此时就该我们的主角var发挥作用了:
foreach( var i in list) { Console.WriteLine(i); }
运行,OK,没问题。
当我们单步调试上述代码的时候,发现i的值为44时,它的类型为object{int};当i的值为为mystring的时候,它的类型为object{string};当i的值为{Temp.MyClass}的时候,它的类型为object{Temp.MyClass}.
我们可以发现,编译器自己根据其右侧的表达式推断出了变量i的类型。
基于var以上的特性,因此我们在使用的时候要注意:
1.初始化时要赋值: 如var i= 123; 不能:var i; i = 123;//编译器需要根据其右边的表达式推断i的类型 2.初始化赋值后,就不能再更改值得类型了: var i = 123;//i的类型已经确定了为int i= "mystring"; //error:无法将类型string隐式转换成int 3.var要求是局部变量。 4.var定义变量和object不同,它在效率上和使用强类型定义方式定义变量完全一样。