隐式类型

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。

 

posted @ 2014-10-28 13:06  透明雨  阅读(524)  评论(0编辑  收藏  举报