• [转]从C# 2.0新特性到C# 3.5新特性


    http://blog.csdn.net/kcseason/archive/2009/05/21/4206710.aspx

    C# 2.0新特性与C# 3.5新特性

    一、C# 2.0 新特性:

    1、泛型
    List<MyObject> obj_list=new List();
    obj_list.Add(new MyObject());

    2、部分类(partial)
    namespace xxx
    {
    public partial class Class1
    {
    private string _s1;
    public string S1
    {
    get { return _s1; }
    set { _s1 = value; }
    }
    }

    //或在另一个文件中
    public partial class Class1
    {
    public string GetString()
    {
    string s = this.S1 + "aaa";
    return s;
    }
    }
    }


    3、静态类
    public static class MyStaticObject
    {
    private static string _s;
    static MyStaticObject()
    {
    _s = "Hello";
    }
    public static string Mothed1()
    {
    return _s + ",world.";
    }
    }

    4、属性访问器可访问性
    public class Class2
    {
    private string _str;
    public string Str
    {
    get { return _str; }
    protected set { _str = value; }
    }
    }

    5、可空类型
    int? aa = null;
    aa = 23;
    if (aa.HasValue)
    {
    int bb = aa.Value;
    }


    6、匿名方法
    class SomeClass //在C#1.0中
    {
    delegate void SomeDelegate();
    public void InvokeMethod()
    {
    SomeDelegate del = new SomeDelegate(SomeMethod);
    del();
    }
    void SomeMethod()
    {
    MessageBox.Show("Hello");
    }
    }

    class SomeClass2
    {
    public delegate void SomeDelegate();
    public void InvokeMothed()
    {
    SomeDelegate del = delegate {
    MessageBox.Show("Hello");
    };
    del();
    }
    }


    7、名称空间别名限定符
    global::

    二、C# 3.0/3.5 新特性:
    1、LinQ(语言集成查询)
    以前,查询XML文件使用XPath,数据库刚用SQL,LinQ搜索任何IEnumerable数据源.
    在ORM解决方案中,LINQ对象用途很大.
    示例:
    List customers = new List();
    IEnumerable query_result = from c in customers
    where c.Money > 100
    orderby c.Name
    select c;
    Linq 包括 Linq to SQL, Linq to Objects, Linq to XML 和 ADO.NET Entity Framework 等几个部分

    2、Lambda表达式。更激动人心的,是一种匿名函数结构,它可以方便的实现委托、查询综合和扩展方法的 delegate 类型参数的初始化定义.
    示例:原来的:
    delegate void Func(int x);
    void Add(int x){x++;}
    Func f=new Func(Add);
    f(1);
    可简化为:
    Func f=(x)=>{x++;};
    或:
    Func f=(int x )=>{x++;};


    3、隐式类型本地变量。var关键字(类型脚本语言中的隐式声明变量,主要针对LinQ设计)
    var num=0;
    var nums[]={1,2,3,4,5};
    var num='a';
    var list=new List();
    foreach(var i in nums){
    num+=i;
    }

    4、扩展方法。extension(允许您扩充任何类,甚至是标记为封装的类,对于扩展的方法必须在静态类里来扩展)
    示例,在string上实现Count()方法:
    using System.Runtime.CompilerService;
    public class Extensions{
    [Extension()]
    public int Count(this string source){
    int count = 0;
    foreach (var item in source){
    count++;
    }
    return count;
    }
    }
    //使用:
    string s="Hello,world!";
    int i=s.Count();


    5、对象和集合初始值设定项。初始化的简化,写实体类方便了
    public class Person{
    public string Name{get;set;} //自动实现属性
    public int Age{get;set;}
    }
    var person1=new Person{Name="tang",Age=21}; //...
    var persons=new List{ //集合初始化器
    new Person{Name="TEW",Age=21},
    new Person{Name="RSA",Age=18}
    };

    6、宽松委托。宽松委托使得 C# 在判断委托实例化赋值时,对于签名不同的函数可以接受。例如 EventArgs 和 MouseEventArgs 是具备继承关系的类,当它们出现在同一个接受 EventArgs 类型参数的委托定义中时,编译器对于这两种委托都能接受。例如:

    delegate void A (object sender, MouseEventArgs e);
    delegate void B (int a, int b);

    EventHandler e1, e2;
    e1 = new A(...);    // OK
    e2 = new EventHandler(...);   // OK
    e1 = e2;    // OK

    B b = (long a, int b) +> ...{ };   // OK

    7、自动实现属性。

    在定义类的属性时,常常需要像下面的代码一样封装一个域。

    private string name;

    public string Name ...{ get ...{ return name; } set ...{ name = value; } }
    C# 3.0 提供了一种简化的属性定义方法,可以实现上述代码的作用。

    public string Name ...{ get; set; }
    这就是自动实现属性。编译器自动实现类似域封装的代码。不过自动实现属性不能定义只读和只有 get 过程的属性;set 也不能具备访问性描述。

    8、匿名类型

    匿名类型常常用在查询表达式的结果中,因为这种类型的返回值往往是一个包含一种特定类型的 IEnumerable<T>。例如,要从上面的例子中选出年龄大于 21 岁,身高大于 160 厘米的 Person 集合,可以采用如下形式。

    var result = from person in persons where person.Age >= 21 && person.Height >= 160
        select new ...{ Name = person.Name, Age = person.Age, Height = person.Height / 100 };

    new { Name = person.Name, Age = person.Age, Height = person.Height / 100 } 是一个匿名类型,编译器将对它做如下声明。

    public class _Anonymous_Name_Age_Height ...{
        public string Name;
        public string Age;
        public decimal Height;
    }

    9、分部方法(partial分部类的分部方法,必须是void返回类型)
    // 文件 1.cs
    public partial class A{
    void B(); //声明
    }

    // 文件 2.cs
    public partial class A{
    void B { Console.WriteLine("B invoked."); } //实现
    }

    这种语法可以把函数的定义和声明分开编写。使用分部方法需要注意:

    1、分部方法的类实体必须为 partial。
    2、分部方法的返回值必须为 void。
    3、如果没有实现分部方法,但却定义了此方法的声明,在使用这个包含分部方法的类时,编译器自动将没有实现的方法签名移除。

  • 相关阅读:
    docker部署spring boot并接入skywalking【探索篇】
    转载:如何处理一个CVE漏洞?
    转载:JavaScript利器分享之Proj4js
    转载:geoserver 2.18.0 跨域配置
    转载:如何实现OSM地图本地发布并自定义配图
    wsl2搭建ElasticSearch集群
    测试方法
    测试用例
    软件测试分类
    前端html
  • 原文地址:https://www.cnblogs.com/day/p/1731474.html
Copyright © 2020-2023  润新知