回 帖 发 新 帖 刷新版面

主题:事件与委托的问题???

本人正刚开始学习C#
现在学习到委托和事件了,小弟有些不明白了请个位高手指点:


我觉得事件就是委托
只不过是有2个参数(object 和 eventargs)和void返回类型和 关键字event的 特殊的委托

例如下面这两个程序,一个是用委托做的,一个是用事件做的。他们完成同一个功能。而且代码几乎相同
我就不懂了 , 既然能使用委托来完成,干吗还要用事件来完成,他们有什么区别,是什么关系呢??????????



///////////////////////////////////////委托//////////////////////////////////////////////
using System;

namespace  a
{
class UserInputMonitor
{
  public delegate void UserRequest();
  public  UserInputMonitor.UserRequest  OnUserRequest;
  public void Run()
  {    do  
   {   
    if (Console.ReadLine()=="h")  
    {    
     OnUserRequest();  
    }    
   }while(true);
   }
}
public class Client
{
     public static void Main()
       {  
      UserInputMonitor monitor=new UserInputMonitor();
      new Client(monitor);
      monitor.Run();
       }
private static void ShowMessage()
  {
   Console.WriteLine("委托"+"   "+"HaHa!!");
  }
Client(UserInputMonitor m)   {
     m.OnUserRequest = new UserInputMonitor.UserRequest(Client.ShowMessage);
     }
}
}
//////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////事件///////////////////////////////////////////////////

using System;

namespace 事件
{
using System;
class UserInputMonitor
{
  public delegate void UserRequest(object sender,EventArgs e); //定义委托
  public event UserRequest OnUserRequest; //此委托类型类型的事件
  public void Run()
  {
       
   do
   {  
    if (Console.ReadLine()=="h")
    {   

     Console.WriteLine("this is envent");
     OnUserRequest(this,new EventArgs());
    }   
   }while(true);
  }
}
    
public class Client
{
       
  public static void Main()
       
  {
    UserInputMonitor monitor=new UserInputMonitor();
       
   new Client(monitor);  
       
   monitor.Run();
       
  }
       
  private void ShowMessage(object sender,EventArgs e)
  {
       
   Console.WriteLine("事件"+"  "+"HaHa!!");
      
  }
Client(UserInputMonitor m)
    {
       m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);  
     }
}

回复列表 (共11个回复)

沙发

事件可以加好几个委托。其实事件是一个委托的链表(读过数据结构你就明白了),每一个+=就是把一个新的委托添加到事件里。触发事件就是触发事件底下n个委托。
另外,委托的签名可以是任何合法的函数签名,不一定要一个object一个EventArgs

板凳

事件是一个委托的链表?
是不是说事件类似一个头节点?

3 楼

理解还不是很清楚,代码拿去调试下。。

4 楼

这个问题还是挺经典的,应该讨论讨论!

5 楼

委托实际上是一个函数指针,但它是由.Net管理的,所以是属于安全性的。

事件事实上是一个特殊的委托。

6 楼

委托决定了事件 方法的参数`

7 楼

事件就是委托链

8 楼

严重不理解!

9 楼

C#中的事件是用委托来实现的,所以event能做的事情,delegate一定能做;这是毫无疑问的。event的存在,当然有价值,而且对于 发布-订阅 (publish,subscribe)的设计模式很有必要。
  考虑一个Clock类,当时钟走过一秒钟,它会生成一个事件,并通知所有的订阅者(subscriber)现在的时间是多少。
  在Clock里定义一个delegate void Tick(DateTime time),再定义一个event Tick tickEvent。注意event的使用方法,它只支持+=和-=;而delegate支持=赋值。如果一个Clock有很多的subscriber,只需tickEvent+=myTick,tickEvent+=yourTick就行了。在Clock的内部,当时钟走过秒,只需要调用tickEvent(System.DateTime.Now)就能通知所有的subscriber。
  上面的功能用delegate会出现什么问题呢?假设Clock的tickEvent这样定义:Tick tickEvent。你可以订阅Clock的事件:tickEvent+=yourTick,我也可以:tickEvent=myEvent。注意,我的订阅将你的订阅覆盖了!当Clock调用tickEvent(System.DateTime.Now)时,只有我能得到通知!原因在于tickEvent=myEvent而没有使用tickEvent+=myEvent;然而这是delegate允许的,event则不允许。

10 楼

委托啊
看看这个
http://www.objecttutor.com/search.php?class=0&key=%CE%AF%CD%D0

我来回复

您尚未登录,请登录后再回复。点此登录或注册