C#3.0 新特性学习笔记(2):var 隐式声明变量

再用2008一段时间了,但是C#3.0的新特性却一直没有详细学习或是梳理过,今天边学边练边整理,体验新特性带来的便捷。

隐含类型局部变量

关键字var :

一.介绍:

在C#3.0中增加了一个变量声明var,这个声明和JavaScript 的 var类似,但也有不同。 

   1. 相同点,他能够用var来声明任何类型的局部变量。

 2. 不同点,他仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量。

从不同点来讲,var仅仅是个关键字,他并不是C#3.0中的一种新的类型,而是负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型。
即:从右边自动识别对象类型,是强类型,且仅限于局部变量
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; 不可以
比如:
foreach(var c in list<string>)
{...}

二.注意点

  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语句中。下面的使用是错误的:

class Program
{
    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#编译器去确定变量的具体类型。那么如果在转换的过程中,发现动态语言的变量改变了类型,该怎么办呢?这个可以使用后面要讲的“匿名类”来解决这个问题。

原文地址:https://www.cnblogs.com/Dlonghow/p/1313267.html