打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#2.0新特性:泛型(Generics)、匿名方法(Anonymous Methods)...

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不允许加入已经编译好的类型。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
.net 匿名函数的变化
帮助理解委托、匿名委托、Lambda表达式还有事件
C#委托(Delegate)简介
工厂方法模式(Factory Method Pattern)
(教学思路 C#之类九)抽象类和接口
C#中的接口
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服