【发布时间】:2012-05-27 16:33:09
【问题描述】:
过去几周我一直对事件感到困惑。我了解代表的工作方式,而不是详细的工作方式,但足以知道
delegate datatype 是一个单一的演员代表。
delegate void 是一个多播委托 - 对方法的引用列表。
我知道委托类型编译为一个类,但不幸的是我仍然不确定该方法是如何被引用的。例如
delegate void TestDelegate();
TestDelegate testDelegate = new TestDelegate(myObject.SomeMethod) ;
问题 1:我认为 myObject 是目标,SomeMethod 是要引用的方法,但我只传递了一个输入。 那么 myObject.SomeMethod 是否编译为字符串,字符串是否按句点拆分?可笑我知道。
问题 2: 当您添加到多播委托时
multicastdelegate+=newmethodtobereference
multicastdelegate() ;
调用列表中的每个方法都被调用或通知?
如果这是真的,为什么我需要事件或 event 关键字地狱?只是简单的告诉开发者,嘿,这是在充当事件吗?因为我很困惑,我只想在这个阶段继续前进,哈哈。这是我今天写的一个示例代码,用于测试是否需要 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;字段中添加event关键字没有区别。
请各位大侠解释一下,让菜鸟看得懂,谢谢。
【问题讨论】:
-
添加行
isEvenNumberFound.IsEvenNumberEvent = null;现在尝试使用event关键字。 -
@BenVoigt 他们都抛出异常?