C#2.0新特性:泛型(Generics)、匿名方法(Anonymous Methods)、迭代器(Iterators)和不完全类型(Partial Types)

来源:互联网 发布:家用网络电话机 编辑:程序博客网 时间:2024/04/27 11:29

1:泛型

不多说了,个人理解泛型就是泛参数化,即用T表示所有的类型。

public class WSView<T>{

public virtual DataTable searchView(T sp)

{。。。。。。}

}

[WebMethod]    public ViewEntity[] ViewSummary(SumParameters sp)    {        WSView<SumParameters> view = new WSView<SumParameters>();        DataTable dt =  view.searchView(sp);        return view.Convert2Entity(dt);    }    [WebMethod]    public ViewEntity[] ViewDetail(DetParameters dp)    {        WSView<DetParameters> view = new WSView<DetParameters>();        DataTable dt = view.searchView(dp);        return view.Convert2Entity(dt);    }

2:匿名方法

没有匿名方法的时候(C# 1.0)

addButton.Click += new EventHandler(AddClick);

void AddClick(object sender,EventArgs e){   listBox.Items.Add(textBox.Text);}

有了匿名方法之后(C# 2.0)

addButton.Click += delegate{   listBox.Items.Add(textBox.Text);}

匿名方法的机制

C# 2.0中的匿名方法仅仅是通过编译器的一层额外处理,来简化委托实例化的工作。它与C# 1.0的代码不存在根本性的差别。

通过ILDasm.exe反汇编工作,我们可以获得对匿名方法的深入了解:   - 静态方法中的匿名方法   - 实例方法中的匿名方法   - 匿名方法中的外部变量

静态方法中的匿名方法

 public delegate void D(); static void F() {    D d = delegate{Console.WriteLine("text");}; }

 上面的代码被编译器转换为:

 static void F() {        D d = new D(Method1);   } static void _Method1() {       Console.WriteLine("test"); }

实例方法中的匿名方法

 class Test {   int x;   void F()   {      D d = delegate{Console.WriteLine(this.x);};   } }

 上面的代码被编译器转换为:

 void F() {     D d = new D(Method1);   }  void _Method1() {       Console.WriteLine(this.x); }

匿名方法的外部变量

 void F() {  int y = 123;  D d = delegate{Console.WriteLine(y);}; }

上面的代码被编译器转换为:

 class _Temp {  public int y;  public void _Method1()  {   Console.WriteLine(y);  } } void F() {  _Temp t = new _Temp();  t.y = 123;  D d = new D(t._Method1); }

3:迭代器

一个简单的例子:class MyStack:IEnumerable    {        int[] items = { 1, 2, 3, 4, 5, 6, 7, 8 };        public IEnumerator GetEnumerator()        {            for (int i = 0; i < items.Length; i++)            {                yield return items[i];            }        }    }使用:MyStack stack = new MyStack();            foreach (int i in stack)            {                listBox1.Items.Add(i);            }

4:不完全类型

Partial,是一个新的类型修饰符,在把一个类型定义在多个部分的时候使用。下面是一个partial class的示例,以两个部分实现。这两个部分可能在两个不同的源代码文件,比如说第一个部分是由一个数据库映射工具产生的,而第二个部分是手工编写的。

 

public partial class Customer{    private int id;    private string name;    private string address;    private List<Order> orders;    public Customer() {            }}public partial class Customer{    public void SubmitOrder(Order order) {        orders.Add(order);    }    public bool HasOutstandingOrders() {        return orders.Count > 0;    }}

 

当上面的两个部分在一起编译,结果产生的代码就好像这个类是写在一个单元里一样。

 

public class Customer{    private int id;    private string name;    private string address;    private List<Order> orders;    public Customer() {            }    public void SubmitOrder(Order order) {        orders.Add(order);    }    public bool HasOutstandingOrders() {        return orders.Count > 0;    }}

 

 

一个partial type的所有部分必须在一起编译,这样所有的部分才能在编译的时候整合在一起。特别的是partial types不允许加入已经编译好的类型。