zoukankan      html  css  js  c++  java
  • C# 3.0特性[转]

    C# 3.0提供以下新特性:

      ·隐式类型本地变量

      ·匿名变量

      ·扩展方法

      ·对象和集合初始化器

      ·Lambda表达式

      ·查询表达式

      ·自动属性

    一、隐式类型局部变量
        使用var关键字来定义隐式类型的局部变量,系统根据初始化赋值时的值来推断变量的类型,故该类型变量要在声明时就进行初始化,如var i=1;同时,var定义的变量在进行初始化赋值以后,就不可以在将其他类型的值赋给给变量,也就说,C#里面的var不像javascript里面的var是弱类型,而是强类型的。

    二、匿名变量

        C#3.0允许创建一个类的实例,而不需要先写这个类的代码,如new {ID="001",Name="Terry",Age=23},系统会自动生成一个匿名类,该类有ID,Name,Age三个属性,以及这三个属性所对应的私有字段。当然如果要使用这种匿名类,还要使用上面提到的隐式类型关键字var,使用如下表示:var emp=new {id="001",name="Terry",age=23},这样以后,emp就是该匿名类的一个静态类型实例了,以后emp这个变量只能再次被赋值为和该匿名类型一致的匿名变量了,不可以赋予其他类型的值。

    三、扩展方法
        扩展方法让你在额外的静态类中使用静态方法来扩展各种类型,注意扩展方法必须是静态的,而且该扩展方法必须在静态类中声明,且以"this"放在第一个参数前来标识,如:

    public static class test
    {
      
    public static int ToInt32(this string s)
      {
      return Convert.ToInt32(s);
      }
    }


    这样在需要使用扩展方法的地方引用该test类所在的命名空间后就可以直接使用该扩展方法了,如:

    string s="100";
    s.ToInt32();


    Object类是所有类的始祖,如果扩展了Object类的某个方法,那么所有类都将扩展了该方法。

    四、对象和集合初始化器
        C#3.0中可以让你不去考虑类的构造函数就去构造对象,如:

    var emp=new Employee{ID="0001",Name="Terry",Age=23}


        C#3.0会自动调用Employee类的无参构造函数构造对象,然后给ID,Name,Age属性赋值。

        集合初始化器类似,如:

    List<Employee> empList=new List<Employee>
    {
      
    new Employee(ID="0001",Name="Terry",Age=23),
      
    new Employee(ID="0002",Name="Mary",Age=24)
    }


       注意,这里面集合里面的类型一定要是具体类型的,不可以是List<var>

    五、Lambda 表达式
        Lambda表达式是C#2.0时代匿名方法的另外一种简洁的写法.
     Lambda 表达式的基本语法为:

    ([[< 类型>] < 变量名>[, [< 类型>] < 变量名>]]) => { < 语句快> };

     Lambda 表达式可以没有参数列表,如:

    代码
    () => { Console.WriteLine(""); };

    //声明委托
    delegate string DelegateTest(string s);

    public static string getString(string t)
     {
      return t;
    }

    //正常委托
    DelegateTest normalDelegate=new DelegateTest(getString);
    //匿名方法
    DelegateTest anonymousDelegate=delegate(string a){return a;};

    //lamda表达式
    DelegateTest lamada=(s)=>{return s;};

    protectedvoidPage_Load(objectsender,EventArgse)
    {
    //通过委托来调用方法
       Response.Write(normalDelegate("一般委托<br>"));
       Response.Write(anonymousDelegate(
    "匿名方法<br>"));
       Response.Write(lamada(
    "lamda表达式"));
    }


     //Lambda表达式除了简洁以外,它还有以下特点:
        1.它允许参数类型是被推断的,即上面语法表达式中的"类型"可以省略,只写变量名,后面的语句会自动推断变量的类型。
        2.=>符号后面既可以支持C#语句,也可以支持linQ查询表达式,即上面语法中的语句块可以使C#语句,也可以是linq表达式。

    六、查询表达式
        它使得可以在C#中使用SQL类似风格的语句,叫做语言集成查询,也称作linq.你可以如下使用:

    List<Employee> empList=new List<Employee>
    {
    new Employee(ID="0001",Name="Terry",Age=23),
    new Employee(ID="0002",Name="Mary",Age=24)
    }

     对于以上集合类型的变量empList,使用linq查询获得想要的结果,如

    var emp1=from t in empList where t.ID=="001" select t;


     linq语句查询获得的是IEnumerable<T>类型的,需要遍历查询后的结果,可以如下:

    foreach(var emp in emp1)
    {
    Console.Write(emp.Name);
    }


    七、自动属性
        C#3.0中提供自动属性,即

    public clss Test
    {
    public string Name{get;set;}
    public int Age{get;set;}
    }


        在调用时,可以直接使用

    Test t=new Test();
    t.Name
    ="Tom";
    t.Age
    =22;
    Console.Write(t.Name);
    Console.Write(t.Age);


        也就是无需实现属性的get和set,也无需定义私有变量,一切C#3.0都会完成。但是这种属性不具备完整性检查,而且如果属性值是自定义类型的话,也不可以,只可以是基础类型。

  • 相关阅读:
    简单的模板解析函数
    HTML通过事件传递参数到js 二 event
    HTML通过事件传递参数到js一
    通过this获取当前点击选项相关数据
    LeetCode 20. 有效的括号(Valid Parentheses)
    LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
    LeetCode 14. 最长公共前缀(Longest Common Prefix)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22
    LeetCode 665. 非递减数列(Non-decreasing Array)
  • 原文地址:https://www.cnblogs.com/mane/p/2055629.html
Copyright © 2011-2022 走看看