委托:

       当要把方法传递给其他方法,这时就需要使用委托。一般 启动线程、通用类库、事件会用到。委托指示一种特殊的对象类型,其特殊之处在于我们以前定义的所有对象都包含数据,而委托包含的只是方法的细节。

      在C#中声明委托:

                             使用委托时,也需要经过两个步骤,首先定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托代表那种类型的方法,然后创建该委托的一个或多个实例

                             定义委托的语法如下:

                             delegate void VoidOperation(uint x)

                             或 delegate double VoidOperation(double x,double y)

        在C#中使用委托:

                              private delegate string GetAString ();

                              static void Main(string[] args)

                               {

                                      int x=40;

                                      GetAString firstStringMethod=new GetAString(x.ToString());

                                      Console.WriteLine("string is"+firstStringMethod);

                               }

 

                         给定委托的实例可以表示任何类型的任何对象上的实例方法或静态方法----只要方法的名匹配于委托的签名即可。

         匿名方法:

                      

delegate string SetTextToTextBlock(string bb);
MainPage()
{
SetTextToTextBlock sss
= delegate(string bb)
{
bb
= "heheeehe";
return bb;
};

Console.WriteLine(SetTextToTextBlock(
"1111"));
}

            

   在使用匿名方法时,必须遵循两个规则。在匿名方法中不能使用跳转语句跳到该匿名方法的外部,反之亦然:匿名方法外部的跳转语句不能跳转到该匿名方法的内部。

   在匿名方法内部不能访问不安全代码。另外,也不能访问在匿名方法外部使用的ref和out参数。但可以使用在匿名方法外部定义的其他变量。

事件:

        委托就用作应用程序接收到消息时封装事件的方式。

        发送器可以是应用程序中的另一个对象或程序集,在系统事件中,例如鼠标单击或键盘按钮,发送器就是.NET运行库。注意,事件的发送器并不知道接收器是谁,这对使用事件非常有用。

        在事件接收器的某个地方有一个方法,它负责处理事件。在每次发生已注册的事件时,就执行这个事件的处理程序。此时就要用到委托了。由于发送器对接收器一无所知,所以无法设置两者之间的引用类型,而是使用委托作为中介。发送器定义接收器要使用的委托,接收器将事件处理程序注册到事件中。连接事件处理程序的过程称为封装事件。

      例:btnOne.Click+=new EventHandler(Button_Click);

            这将告诉运行库,在引发btnOne的Click事件时,应执行Button_Click方法。EventHandle是事件用于把处理程序(Button_Click)赋予事件(Click)的委托。

     同样也可以用匿名方法:btnOne.Click+=new EventHandle(lblInfo.Text="匿名方法";);

  生成事件:下面通过一个例子将介绍如何创建、引发、接收、和取消事件。

                  这个例子包含一个窗体,它会引发另一个类正在监听的事件。在引发事件后,就收对象就确定是否执行一个过程,如果该过程未能继续,就取消事件。本例的目标是确定当前时间的秒数是大于30还是小于30.如果小于30,就用一个表示当前时间的字符串设置一个属性:如果秒数大于30,就取消事件,把时间字符串设置为空。

                      创建:

                            public  delegate void ActionEventHandler(object sender,ActionCancelEventArgs ev);

                            public static event ActionEventHandler Action;

               

                           

posted on 2011-02-28 22:28  肉丝  阅读(152)  评论(0)    收藏  举报