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

  • 相关阅读:
    jquery ajax参数详解
    压缩解压函数实现
    WCF 大数据量如何从服务端传到客户端
    [DllImport("kernel32.dll")]
    Oracle数据库使用基础和实例
    Js常用的动态效果
    Js使用正则实现表单验证
    Oracle数据库理论知识
    HTML5,CSS3,JavaScript基础知识与使用
    速读《人月神话》
  • 原文地址:https://www.cnblogs.com/Dlonghow/p/1313267.html
Copyright © 2011-2022 走看看