1 定义
我们可以使用var关键字来定义隐式类型的变量或者数组:
//定义基本类型 var i = 23; var str = "hello!"; //定义数组 var arr = new[] { "小明","小李","小赵"}; //自定义类型 var p = new Person() { Name="wjw",Age=26};
可以看出,关键字var可以用来定义各种类型的变量,但是使用隐式类型后,编译器到底为隐式类型的变量做了什么附加操作呢?
2 本质分析
通过查看编译后的IL代码,如下图
从反编译的代码中,可知编译器在编译时期,如果遇到隐式类型的变量时,将根据其等号右边的值的类型来推算该变量本身的实际类型,然后用真实的数据类型替换var
这个过程由编译器在编译时期自动完成。
当我们不确定赋值变量的数据类型的时候,就可以使用var,这样就有可能避免类型转换,比如有可能发生装箱 拆箱,从而引起性能
3 注意事项
(1) 声明的同时必须初始化,因为编译时要根据初始化值类型来推断var
(2)使用var定义个变量后,将不能修改数据类型,因为初始化的时候已经确定var数据类型了
比如var i=10,i="hello" 出现错误:
无法将类型“string”隐式转换为“int” F:\基础学习\mvc基础知识\02 新语法\02 隐士类型\Program.cs 16 17 02 隐士类型
(3)var 定义的变量只能作为方法局部变量使用。类的成员字段、方法的形参和返回值都不能使用!因为无法编译时确定他们的类型!
(4)初始化表达式不能是匿名函数和null。