我正在学习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
答案 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)
ChangeNum
是EventTest
的事件,事件是您经常收听的订阅,并且在关联对象的状态发生更改时引发。
现在你的代码
if (ChangeNum != null)
{
ChangeNum();
}
else
{
Console.WriteLine("Event fired!");
}
if
正在检查是否已为该事件进行了任何订阅,如果有任何方法正在侦听它,它将让该方法知道该对象的状态已更改
else
部分在控制台上显示消息,如果没有订阅该事件的方法!