再用2008一段时间了,但是C#3.0的新特性却一直没有详细学习或是梳理过,今天边学边练边整理,体验新特性带来的便捷。
隐含类型局部变量
关键字var :
一.介绍:
在C#3.0中增加了一个变量声明var,这个声明和JavaScript 的 var类似,但也有不同。
1. 相同点,他能够用var来声明任何类型的局部变量。
2. 不同点,他仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量。
var a = "abc"; 等价于: string a="abc";
var b = new []{1,2,3,5}; 等价于: int[] b = new int[]{1,2,3,5};
var c = null; 不是类型,不能用
var d; 不可以
比如:
{...}
二.注意点
1.在声明时必须同时赋值,因为声明依赖于赋值号右边的表达式,假如有下面的语句:
var integer;
integer = 10;
编译时会报Implicitly typed locals must be initialized错误。
2.在使用var声明一个局部变量后,他仍然具备强类型,(即:一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。)能够做如下测试:
var integer = 10;
integer = " edisundong ";
编译时会报Cannot implicitly convert type string to int错误。
3. 初始化器表达式的编译期类型不能够是空(null)类型,编译器无法根据null来推断出局部变量的类型,如有下面的语句:
var integer = null;
编译时会报Cannot assign <null> to an implicitly typed local错误。
4. 初始化语句必须是个表达式,初始化表达式不能包含他自身,但是能够是包含一个对象或集合初始化器的一个new表达式(即匿名类型)。
如能够这样去声明:
var coll = new Hashtable();
5.var的声明仅限于局部变量,也能够包含在foreach、for、using语句中。下面的使用是错误的:
{
private var i = 10; //全局私有变量。
static void Main(string[] args)
{ }
}
编译时会报The contextual keyword var may only appear within a local variable declaration错误。
6. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。但笔者建议如果事先知道变量的类型,尽量使用强类型方式来声明变量。否则,就会造成由于大量使用var,而使得开发人员很难断定某个变量是什么类型。这样不利于程序的维护和升级。
总结:虽然var有利有弊。
依我的个人观点,这将降低代码的可读性,但是有人说这个关键字主要是针对LinQ而设计得,因为LinQ所涉及的类型可能相当的复杂或在申明变量时还不知道其类型。根据前人的经验总结这个关键字只是为了忽悠我们,正如前面提到的,在编译下还是强类型的,它在IL中也并没有出现新的东西。值得注意的是用var声明的变量一定要初始化,如果对于几何类型的初始化时还必须指名其类型(var list = new List<int>();//int 要指出)。
另外,如果将动态语言转换成C#语言,可以考虑使用var来定义变量。这是因为动态语言没有类型,而要将其转换成强类型的C#语言,就必须给变量指定个类型,但事先确定类型是很费劲的,不如将其指定成var,再由C#编译器去确定变量的具体类型。那么如果在转换的过程中,发现动态语言的变量改变了类型,该怎么办呢?这个可以使用后面要讲的“匿名类”来解决这个问题。