事件与委托的问题???

我觉得事件就是委托
只不过是有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);  
     }
}
 

 

答:

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值