在过去的几周里,我一直对事件感到困惑。我知道代理(delegate)是如何工作的,但不是很清楚它的详细工作原理,只知道
我知道代理类型编译成一个类,但不幸的是,我仍然不确定方法是如何引用的。比如说:
将事件关键字添加到字段
delegate datatype
是单一委托(single cast delegate),而delegate void
则是多重委托(multicast delegate)- 是指方法引用的列表。我知道代理类型编译成一个类,但不幸的是,我仍然不确定方法是如何引用的。比如说:
delegate void TestDelegate();
TestDelegate testDelegate = new TestDelegate(myObject.SomeMethod) ;
问题1:我认为myObject是目标对象,SomeMethod是要引用的方法,但我只传递了一个输入参数。所以myObject.SomeMethod是否编译成字符串,然后由句点进行分割?这个想法很荒谬。
问题2:当您向多播委托添加内容时
multicastdelegate+=newmethodtobereference
multicastdelegate() ;
委托列表中的每个方法都会被调用或通知吗?
如果是这样,为什么我需要事件或event
关键字呢?是为了告诉开发人员,“嘿,这是一个事件”吗?因为我真的很困惑,我只想进入下一阶段。这是我今天编写的一个示例代码,以测试是否需要事件关键字。
using System;
namespace LambdasETs
{
public delegate void IsEvenNumberEventHandler(int numberThatIsEven);
public class IsEvenNumberFound
{
public IsEvenNumberEventHandler IsEvenNumberEvent;
private int number;
public void InputNumber(int n)
{
if(number %2 ==0)
{
if (IsEvenNumberEvent != null)
{
IsEvenNumberEvent(n);
}
}
}
public static void Main()
{
IsEvenNumberFound isEvenNumberFound = new IsEvenNumberFound();
isEvenNumberFound.IsEvenNumberEvent += IsEvenNumberAction;
isEvenNumberFound.InputNumber(10);
Console.ReadLine();
}
public static void IsEvenNumberAction(int number)
{
Console.WriteLine("{0} is an even number!", number);
}
}
}
将事件关键字添加到字段
public IsEvenNumberEventHandler IsEvenNumberEvent;
中没有任何区别。
请有人解释一下,以便新手可以理解,谢谢。
isEvenNumberFound.IsEvenNumberEvent = null;
,现在尝试使用event
关键字。 - Ben Voigt