zoukankan      html  css  js  c++  java
  • [转]从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、如果没有实现分部方法,但却定义了此方法的声明,在使用这个包含分部方法的类时,编译器自动将没有实现的方法签名移除。

  • 相关阅读:
    Delphi公用函数单元
    Delphi XE5 for Android (十一)
    Delphi XE5 for Android (十)
    Delphi XE5 for Android (九)
    Delphi XE5 for Android (八)
    Delphi XE5 for Android (七)
    Delphi XE5 for Android (五)
    Delphi XE5 for Android (四)
    Delphi XE5 for Android (三)
    Delphi XE5 for Android (二)
  • 原文地址:https://www.cnblogs.com/day/p/1731474.html
Copyright © 2011-2022 走看看