C# 委托与事件

时间:2022-08-14 05:49:08
看了很多事例和解释 还不是太理解委托和事件的概念,就知道用控件时的自动生成的事件,想明白他的原理~求大神解释一下,最好简单易懂的 举下例子也可以。谢了

12 个解决方案

#2


引用 1 楼 www52rsNet 的回复:
深入理解c#委托和事件

看过了

#3


我也是,看完资料就明白,过后就又晕了

#4


求高手解答呀~~

#5


好比现实生活中的我交给你一件事去办这个例子。
首先我需要定义出来这个事到底是干嘛?也就是事件的描述,这个描述在代码中是通过委托方式表现的。(比如我要你去叫某个人)
delegate void CallSthBodyDelegate(string personName);
上面这个就是这个事件的契约,也是我和你沟通的方式,你在做相关事情的时候必须要符合这个契约。

然后才有了基于这个描述的事件
class Me
{
public event CallSthBodyDelegate MyRequest;
  void CallZhangsan()
   { 
    var del=MyRequest;
   if(del!=null)
   {
     del("zhangsan");
    }
   }
}
接下来我需要把这件事交给你去办吧?
MyRequest+=YOUDO //事件的挂接方式
YOUDO当然去接受这个事件的相关信息吧,相关信息也就是我们前面定义出来的委托的格式
YOUDO:
class You
{
  public You()
  {
    Me m=new Me();
    m.MyRequest+=CallSthBodyDelegate(CallPerson);
  }
  

  void CallPerson(string personName)
  {
    Console.Write(string.Format("{0} was called",personName));
  }
}

#6


你自己写一个dll就懂了,我写个需求给你
-----------------------------------------------

编写一个类库,编译成dll,供其他开发者引用

dll里,有一个方法GetData,返回值是DataTable
dll里还有timer,每隔一段时间,就调用一下GetData方法,比如每隔几秒就通过GetData获取出一个dataTable

通过事件,能让引用dll的开发人员使用获取出的DataTable

实现的效果就是:当dll内部获取出数据后,把数据抛到引用dll的层中进行使用
----------------------------------------------------------------------------

把这个类库做好,你就懂了。我当初就是开发这个程序搞懂的委托和事件

当你开发程序引用外部dll的时候,dll里什么时候获取到数据是未知,只能通过抛出事件来实现

这就是事件和方法的最主要区别,方法是自己在代码里调用,代码运行到就执行,而事件啥时候运行,对于开发人员来说是不确定的

就像你编写了一个按钮点击事件,写了相应的代码

但这些代码什么时候执行,你确定不了,啥时候点按钮啥时候就执行

#7


引用 6 楼 bluceyoung 的回复:
你自己写一个dll就懂了,我写个需求给你
-----------------------------------------------

编写一个类库,编译成dll,供其他开发者引用

dll里,有一个方法GetData,返回值是DataTable
dll里还有timer,每隔一段时间,就调用一下GetData方法,比如每隔几秒就通过GetData获取出一个……

我懂了这个逻辑,但是不太理解那语法丝的,能指点下吗

#8


你都理解了逻辑,语法还有什么可说的……

委托就是平时写的方法,加个delegate

事件跟委托的关系就仿佛属性和字段的关系

#9


委托是对方法的引用,可以引用多个方法,他其实是一个类,包含了线程间调用接口
事件是封装为属性的委托

#10


看着看着 似乎明白 又有点不明白,晕啊~ C# 委托与事件

#11


我想说的是 事件的定义完了 我们怎么设置他的触发条件呢 求个例子

#12


你去超市购物,就是事件。我托你给我带包烟,就是委托!

#1


#2


引用 1 楼 www52rsNet 的回复:
深入理解c#委托和事件

看过了

#3


我也是,看完资料就明白,过后就又晕了

#4


求高手解答呀~~

#5


好比现实生活中的我交给你一件事去办这个例子。
首先我需要定义出来这个事到底是干嘛?也就是事件的描述,这个描述在代码中是通过委托方式表现的。(比如我要你去叫某个人)
delegate void CallSthBodyDelegate(string personName);
上面这个就是这个事件的契约,也是我和你沟通的方式,你在做相关事情的时候必须要符合这个契约。

然后才有了基于这个描述的事件
class Me
{
public event CallSthBodyDelegate MyRequest;
  void CallZhangsan()
   { 
    var del=MyRequest;
   if(del!=null)
   {
     del("zhangsan");
    }
   }
}
接下来我需要把这件事交给你去办吧?
MyRequest+=YOUDO //事件的挂接方式
YOUDO当然去接受这个事件的相关信息吧,相关信息也就是我们前面定义出来的委托的格式
YOUDO:
class You
{
  public You()
  {
    Me m=new Me();
    m.MyRequest+=CallSthBodyDelegate(CallPerson);
  }
  

  void CallPerson(string personName)
  {
    Console.Write(string.Format("{0} was called",personName));
  }
}

#6


你自己写一个dll就懂了,我写个需求给你
-----------------------------------------------

编写一个类库,编译成dll,供其他开发者引用

dll里,有一个方法GetData,返回值是DataTable
dll里还有timer,每隔一段时间,就调用一下GetData方法,比如每隔几秒就通过GetData获取出一个dataTable

通过事件,能让引用dll的开发人员使用获取出的DataTable

实现的效果就是:当dll内部获取出数据后,把数据抛到引用dll的层中进行使用
----------------------------------------------------------------------------

把这个类库做好,你就懂了。我当初就是开发这个程序搞懂的委托和事件

当你开发程序引用外部dll的时候,dll里什么时候获取到数据是未知,只能通过抛出事件来实现

这就是事件和方法的最主要区别,方法是自己在代码里调用,代码运行到就执行,而事件啥时候运行,对于开发人员来说是不确定的

就像你编写了一个按钮点击事件,写了相应的代码

但这些代码什么时候执行,你确定不了,啥时候点按钮啥时候就执行

#7


引用 6 楼 bluceyoung 的回复:
你自己写一个dll就懂了,我写个需求给你
-----------------------------------------------

编写一个类库,编译成dll,供其他开发者引用

dll里,有一个方法GetData,返回值是DataTable
dll里还有timer,每隔一段时间,就调用一下GetData方法,比如每隔几秒就通过GetData获取出一个……

我懂了这个逻辑,但是不太理解那语法丝的,能指点下吗

#8


你都理解了逻辑,语法还有什么可说的……

委托就是平时写的方法,加个delegate

事件跟委托的关系就仿佛属性和字段的关系

#9


委托是对方法的引用,可以引用多个方法,他其实是一个类,包含了线程间调用接口
事件是封装为属性的委托

#10


看着看着 似乎明白 又有点不明白,晕啊~ C# 委托与事件

#11


我想说的是 事件的定义完了 我们怎么设置他的触发条件呢 求个例子

#12


你去超市购物,就是事件。我托你给我带包烟,就是委托!