• 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都会完成。但是这种属性不具备完整性检查,而且如果属性值是自定义类型的话,也不可以,只可以是基础类型。

  • 相关阅读:
    CSS text-indent 属性
    从零开始搭建一个简单的基于webpack的vue开发环境
    mui is not defined
    vue项目中引入mui.poppicker.js文件时报错“Uncaught ReferenceError: mui is not defined”
    vue-cli创建的项目中引入第三方库报错'caller', 'calle', and 'arguments' properties may not be...
    微信小程序点击顶部导航栏切换样式
    js学习笔记-日期对象
    setTimeout()和setInterval()的用法及区别
    Ubuntu 14.04 下安装redis后运行redis-cli 报出redis Connection refused错误【已解决】
    Ubuntu start:未知任务:mysql
  • 原文地址:https://www.cnblogs.com/mane/p/2055629.html
Copyright © 2020-2023  润新知