温故而知新-----委托

委托是一种定义方法签名的类型。

当实例委托时,您可以将其实例与任何具有兼容签名的方法相关联。可以通过委托实例调用方法。

委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。

自己创建一个自定义的方法,当发生特定事件时某个类(控件)就可以调用您的方法。委托的声明如下:

pubic delegate int Calculation(int x,int y);

与委托的签名(返回类型和参数)匹配的任何可访问类或结构中的任何方法都可以分配给该委托。方法可以是静态方法,也可以是实例方法。

在方法重在的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名包括返回值。也就是,方法和委托必须具有相同的返回值。

委托特点:

委托类似于C++函数指针,但它们是类型安全的。

委托允许将方法作为参数进行传递。

委托可以用于定义回调方法。

委托可以链接在一起。例如:可以对一个事件调用多个方法。

方法不必与委托签名完全匹配。(变体)

2.0中匿名方法的概念,允许将代码块作为参数传递,以代替单独定义的方法。3.0引入Lamnda表达式,可以更简练的编写内联代码块。匿名方法和Lambda表达式(在某些上线问中)都可以编译为委托类型。

 

委托是一种安全的封装方法的类型,它与C和C++类似。不同的是,委托是面向对象的、类型安全的和保险的。

public delegate void Del(string message);

该委托可以封装一个采用字符串作为参数并返回void的方法。

构造委托对象时,通常提供委托将包装的方法的名称或使用匿名方法。实例化委托后,,委托将把对它进行的方法调用传递给方法。调用传递给问哦拖的参数被传递给方法,来自方法的返回值(如果有)将由委托返回给调用方。可以将一个实例化的委托视为被包装的方法本身来调用该委托。

 

public delegate void DelMethod(string message)

{

   Console.WriteLine(message);

}

Del hand=DelMethod;

hand("hello wprd");

委托派生自Delegate类。委托类型是密封的,不能从Delegate中派生委托类型,也不能从中派生自定义类。由于实例化委托是一个对象,多疑可以将其作为参数进行传递,也可以将其赋值给属性。这样,方法就可以将一个委托作为参数来接受,并以后可以调用该委托。(异步回调!!).在较长的进程完成后用来通知调用方的常用方法。

回调还有一个常用法。

自定义一个比较方法并将该委托传递给排序方法。

 

调用委托时,可以调用多个方法。称为多路广播。想委托的方法列表中添加额外的方法,只需要使用“+”或“+=”。话不多说,上例子:

public class Methods

{

  public void Method1(string message){}

  public void Method2(string message){}

  public void Method3(string message){}

}

 Methods me=new Methods();

Del d1=me.Method1;

Del d2=me.Method2;

Del d3=me.Method3;

Del allMethodsDelegate=d1+d2;

allMethodsDelegate+=d3;

此时,allMethodsDelegate在起调用列表中包含三个方法Method1、Method2、Method3.原来的三个委托d1、d2、d3保持不变。

调用allMethodsDelegate时,将按顺序调用这三个方法。如果委托使用引用参数,则引用将依次传递给这三个方法中的每个方法,由一个方法引起的更改对下一个方法是可见的。如果任意一个方法引发了异常,而在该方法内未捕捉该异常,则该异常将传递给委托的调用方,后面的方法将不调用。如果委托有返回值或输出参数,返回最后调用的方法的返回值或参数。

如果要将方法从调用列表中移除用“-”或“-=”。

 

posted on 2012-06-13 16:13  Cassie,zh  阅读(129)  评论(0编辑  收藏  举报

导航