编程语言可以分为两类:一种是强类型语言,譬如C#、JAVA、C++等,另外一类是弱类型语言,比如一些脚本语言javascript等。
强类型语言是,变量在使用前必须定义,类型之间区分比较明显,如果两个类型不相容,则不能隐式的转换,必须进行显示转换。
弱类型语言是,变量在使用前不要求必须定义,类型之间没有明显的界限,变量在使用时会自动转换为合适的目标类型。
也就是说,强类型语言的变量必须有明确的类型,如int、string等,而弱类型语言则没有这样的要求,譬如javascript中的类型都可以是var。C#3.5中引入了一个新的关键字"var",可以代表任何类型,但是不要认为C#在往弱类型语言靠拢,这里的"var"和javascript中的"var"有本质的区别。
在C#3.5中,如果有一个局部变量被声明为var,这个声明被视为隐式类型的局部变量(Implicitly Typed Local Variables)声明,然后由编译器根据等号右边的初始化表达式来推断变量的类型
var的使用注意以下几个方面:
1. 编译的时候,局部变量被编译为具体类型;根据等号右边的表达式,决定类型
2. 编译器自动判断和决定类型,var仅仅起占位符的作用;不同于object,var声明出来的是强类型,如下是错误的:
a)
b)
3.
4.
5. 编译器必须应该能够从等号右边推断出类型,初始化语句必须是一个表达式,初始化表达式不能包含它自身,不可以是对象或集合初始化器,但是可以是包含一个对象或集合初始化器的一个new表达式(即匿名类型)。
a)
强类型语言是,变量在使用前必须定义,类型之间区分比较明显,如果两个类型不相容,则不能隐式的转换,必须进行显示转换。
弱类型语言是,变量在使用前不要求必须定义,类型之间没有明显的界限,变量在使用时会自动转换为合适的目标类型。
也就是说,强类型语言的变量必须有明确的类型,如int、string等,而弱类型语言则没有这样的要求,譬如javascript中的类型都可以是var。C#3.5中引入了一个新的关键字"var",可以代表任何类型,但是不要认为C#在往弱类型语言靠拢,这里的"var"和javascript中的"var"有本质的区别。
在C#3.5中,如果有一个局部变量被声明为var,这个声明被视为隐式类型的局部变量(Implicitly Typed Local Variables)声明,然后由编译器根据等号右边的初始化表达式来推断变量的类型
var的使用注意以下几个方面:
1. 编译的时候,局部变量被编译为具体类型;根据等号右边的表达式,决定类型
2. 编译器自动判断和决定类型,var仅仅起占位符的作用;不同于object,var声明出来的是强类型,如下是错误的:
a)
var integer
=
12345
;
b)
integer
=
"
http://www.fengzhiqiang.name
"
;
3.
var s
=
null
//
错误!因为编译器不能判断出null的类型
4.
var x;
//
错误,隐式类型的局部变量必须在声明的时候初始化
5. 编译器必须应该能够从等号右边推断出类型,初始化语句必须是一个表达式,初始化表达式不能包含它自身,不可以是对象或集合初始化器,但是可以是包含一个对象或集合初始化器的一个new表达式(即匿名类型)。
a)
var MichaelFeng
=
...
{“丰志强”,” http://www.fengzhiqiang.name”,”专注.NET”} //错误
b)
6. var的声明仅仅限于局部变量,也可以包含在foreach、for、using语句中。
b)
var MichaelFeng
=
new
[]
...
{ "丰志强", " http://www.fengzhiqiang.name", "专注.NET" }
;
//
正确
6. var的声明仅仅限于局部变量,也可以包含在foreach、for、using语句中。
static
void
loop()
... {
var MichaelFeng = new string[] ...{ "丰志强"," http://www.fengzhiqiang.name”, "专注.NET" };
foreach (var i in MichaelFeng)
...{ Console.WriteLine("MichaelFeng :{0}", i); }
}
7. Var不能作为方法的参数或者返回值
这句话错误:
但是下面的是正确的:
... {
var MichaelFeng = new string[] ...{ "丰志强"," http://www.fengzhiqiang.name”, "专注.NET" };
foreach (var i in MichaelFeng)
...{ Console.WriteLine("MichaelFeng :{0}", i); }
}
7. Var不能作为方法的参数或者返回值
这句话错误:
public
var MyMethod(var x, var y)
...
{ }
static
string
GetAnInt()
... { var retVal = “丰志强”;
return retVal; }
... { var retVal = “丰志强”;
return retVal; }
隐式类型的局部变量深入分析(详情请参看视频)
1. 使用Console.WriteLine("MichaelFeng is : {0}", MichaelFeng.GetType().Name);
2. 使用ILDASM
3. 隐式类型的局部变量较多用在linq查询表达式的返回值,其他地方慎用(一方面给其他人阅读带来难度,另一方面给排错也带来问题),只用在不太容易判断类型的地方
视频下载:
VS2008&C#3.5语言特色系列视频:隐式类型的局部变量(第1部分,共2部分)
http://download.csdn.net/source/405984
VS2008&C#3.5语言特色系列视频:隐式类型的局部变量(第2部分,共2部分)