过去几周我对发生的事情感到困惑。我了解代表如何工作,但不了解其详细工作方式,但足以了解这一点delegate datatype
是单个演员委托。delegate void
是一个多播委托 - 对方法的引用列表。
我知道委托类型编译为类,但不幸的是我仍然不确定如何引用该方法。例如
delegate void TestDelegate();
TestDelegate testDelegate = new TestDelegate(myObject.SomeMethod) ;
问题 1:我认为 myObject 是目标,SomeMethod 是要引用的方法,但我只传递一个输入。
那么 myObject.SomeMethod 是否编译为字符串,并且该字符串是否按句点分割?我知道这很荒谬。
问题2:
当您添加到多播委托时
multicastdelegate+=newmethodtobereference
multicastdelegate() ;
调用列表中的每个方法都被调用或通知吗?
如果这是真的,为什么hell我需要活动还是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;
没有区别。
请解释一下,以便菜鸟能够理解,谢谢。
事件是委托的访问器,就像属性是字段的访问器一样。出于大致相同的目标,它可以防止其他代码弄乱委托对象。就像当一堆你不知道的代码订阅了回调时将其设置为 null 一样。事件限制访问只能使用 += 和 -= 运算符添加和删除事件处理程序,外部代码根本无法访问私有委托对象。
并通过以下方式自定义订阅添加和删除访问器 http://msdn.microsoft.com/en-us/magazine/cc163533.aspx。您不经常这样做,因为您通常对编译器生成的默认访问器感到满意。包括存储委托的隐藏支持字段。但例如在框架代码中这种情况并不少见。与 System.Windows.Forms.Control 支持的许多事件的所有事件处理程序一样,它们都存储在单个 EventHandlerList 中。或 WPF 等效项 EventHandlersStore。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)