解释此事件的工作原理

时间:2013-12-08 11:11:59

标签: c# events methods delegates

我正在学习C和C#,这个问题适用于C#。这是什么意思?这个问题已经关闭,但我不明白为什么,我问的代码让我很困惑,写了Console.WriteLine(“事件被解雇了!”);到控制台,如果它是null。我不明白它解雇了什么。事件是否有所作为?

 if (ChangeNum != null)
 {
    ChangeNum();
 }
 else
 {
    Console.WriteLine("Event fired!");
 }

如果changeNum不为null,它只是说它被解雇了,它在哪里开火,为什么它会被激活?没有订阅活动。这是做什么ChangeNum();?

以下是代码:

public class EventTest
{
   private int value;

   public delegate void NumManipulationHandler();

   public event NumManipulationHandler ChangeNum;

   protected virtual void OnNumChanged()
   {
      if (ChangeNum != null)
      {
         ChangeNum();
      }
      else
      {
         Console.WriteLine("Event fired!");
      }
   }
   public EventTest(int n )
   {
      SetValue(n);
   }
   public void SetValue(int n)
   {
      if (value != n)
      {
         value = n;
         OnNumChanged();
      }
   }
 }

 public class MainClass
 {
    public static void Main()
    {
       EventTest e = new EventTest(5);
       e.SetValue(7);
       e.SetValue(11);
       Console.ReadKey();
    }
 }
 }

此代码来自本教程here

3 个答案:

答案 0 :(得分:2)

OnNumChanged方法会触发ChangeNum事件。 C#中的事件正在使用委托来实现。

if(ChangeNum != null)部分是一种标准模式,如果您的活动没有订阅者,则允许代码不执行任何操作(或者在您的情况下打印“Event fired!”)。如果您没有执行此null检查,则ChangeNum()调用将导致空引用异常。

答案 1 :(得分:2)

首先检查if any delegate is hooked to an event(如果没有代理人挂钩, null )。

如果yes只是raise the event,那么该事件的委托挂钩就会被执行。否则,如果不将委托挂钩到事件,则只需在Console上写入。

发布代码输出将是 -

Event fired!
Event fired!
Event fired!

但是,如果您挂钩该事件并提供如下代理 -

EventTest e = new EventTest(5);
e.ChangeNum += Handler;

private void Handler()
{
   Console.WriteLine("Event handled!");
}

输出将是 -

Event fired!
Event handled!
Event handled!

由于您已连接到该事件,因此它不再为null。它将引发一个只调用方法Handler()的事件。

答案 2 :(得分:2)

ChangeNumEventTest的事件,事件是您经常收听的订阅,并且在关联对象的状态发生更改时引发。

现在你的代码

if (ChangeNum != null)
 {
    ChangeNum();
 }
 else
 {
    Console.WriteLine("Event fired!");
 }

if正在检查是否已为该事件进行了任何订阅,如果有任何方法正在侦听它,它将让该方法知道该对象的状态已更改

else部分在控制台上显示消息,如果没有订阅该事件的方法!