C#中委托和事件

Posted on 2008-04-10 21:16 火山工作室 阅读(69) 评论(0)  编辑 收藏 引用 网摘 所属分类: 高职IT教育

1)委托的语法:从形式上看是方法,从理解上看要认为它是类。

public delegate  返回类型 委托名(参数);

示例:

public delegate void SimpleDelegate(string s);  //定义一个委托,确定了函数的签名

class Test

{       static void F(string s)                //C#定义的一个非常普通的方法

注意这两个参数的格式是相同的

{

              System.Console.WriteLine("Test.F   {0}",s);

         }

     static void Main()

{

         SimpleDelegate d = new SimpleDelegate(F);  //将委托实例化,实参是一个方法的名字

         d("Hello,This a delegate");             //用委托,本质上调用的是F这个方法.

     }

}

 

2)如何理解委托

l  委托 delegate是只有一个函数的特殊的类,并且这个函数是哪一个都不知道,在实例化时才将这个方法名输入进来。

l  委托对象的引用相当函数指针

l  delegate 声明定义一种引用类型,该类型可用于将方法用特定的签名封装。委托实例封装静态方法或实例方法。委托大致类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。

l  委托使您得以将函数作为参数传递。传递的函数形参和委托声明的形参必须相同,即相同的方法签名

3)多播委托

l  委托类型实例化时,可以在new后面输入一个方法名。但也可以事后用“+”运算符来组合绑定其它的方法进来。组合的委托依次调用组成它的两个委托。

l  只可组合相同类型的委托,并且委托类型必须具有 void 返回值。

l  -”运算符可用来从组合的委托移除组件委托

示例:

delegate void SampleDelegate(string message); // 声明委托,定义所需要的签名

class MainClass

{

    //在类中定义两个具有与委托相同参数列表的方法

 

    static void SampleMethod1(string message)

    {

        Console.WriteLine("SampleMethod1\t" + message);

    }

    static void SampleMethod2(string message)

    {

        Console.WriteLine("SampleMethod2\t" + message);

    }

 

 

    static void Main(string[] args)

    {

        SampleDelegate d1 = SampleMethod1;

        SampleDelegate d2 = SampleMethod2;

        SampleDelegate d3 = d1 + d2;

        d3("Test");

    }

}

 

4)事件

事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。

  在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。 .NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。。

要定义、处理事件,必须按下列顺序完成:

1、以委托定义事件的方法签名,比如:

2、定义一个事件及事件触发的逻辑。

3、定义事件处理方法

4、并且将事件连接到事件处理方法;

5、事件源,触发事件。

    基于 Windows 的应用程序和 Web 应用程序都是基于事件驱动的应用程序,即根据事件来执行代码。

5)自定义事件示例

MyEventHandler.cs

public delegate void MyEventHandler(object o,MyEventArgs args);

MyEventArgs.cs

     public class MyEventArgs

     {

         private string s;

         public MyEventArgs(string s)

         {

              this.s = s;

         }

         public string Message

         {

              get

              {

                   return s;

              }

         }

     }

MyClass.cs

public class MyClass

{

     public event MyEventHandler MyClick;//定义一个事件

 

     public void OnEvent(int i)  //事件发生

     {

         if(i=100)

              MyClick(this,new MyEventArgs("打架事件"));

     }

}

Display.cs

public class Display

{

     public void Mybutton1_Click(object sender, MyEventArgs e)

     {

         Console.WriteLine("事件已经发生:"+e.Message);

     }

}

Class1.cs

using System;

class Class1

{

     static void Main(string[] args)

     {

         MyClass mytest = new MyClass();

         Display myDisplay = new Display();

         mytest.MyClick += new MyEventHandler(myDisplay.Mybutton1_Click);

         mytest.OnEvent(100);

     }

}

以上程序的类图如下:

 


只有注册用户登录后才能发表评论。

posts - 46, comments - 16, trackbacks - 0, articles - 7

Copyright © 火山工作室