gpt4 book ai didi

c# - 为什么事件需要委托(delegate)?为什么我们甚至需要事件?

转载 作者:太空狗 更新时间:2023-10-29 22:53:23 28 4
gpt4 key购买 nike

过去几周我一直对事件感到困惑。我了解代表的工作方式,不是详细工作方式,但足以了解delegate datatype 是单个强制转换委托(delegate)。delegate void 是一个多播委托(delegate) - 方法引用的列表。

我知道委托(delegate)类型可以编译成类,但不幸的是我仍然不确定如何引用该方法。例如

delegate void TestDelegate();
TestDelegate testDelegate = new TestDelegate(myObject.SomeMethod) ;

问题 1:我认为 myObject 是目标,SomeMethod 是要引用的方法,但我只传递一个输入。那么 myObject.SomeMethod 是否被编译成一个字符串并且字符串被句点分割?我知道这很荒谬。

问题二:当您添加到多播委托(delegate)时

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; 没有区别。请解释一下,以便菜鸟能够理解,谢谢。

最佳答案

事件是委托(delegate)的访问器,就像属性是字段的访问器一样。出于相同的目标,它可以防止其他代码干扰委托(delegate)对象。就像当一堆您不知道的代码订阅了回调时将其设置为 null 一样。事件限制访问只能使用 += 和 -= 运算符添加和删除事件处理程序,外部代码根本无法访问私有(private)委托(delegate)对象。

并使用 add and remove accessors 自定义订阅.您不经常这样做,因为您通常对编译器生成的默认访问器感到满意。包括存储委托(delegate)的隐藏支持字段。但这在例如框架代码中并不少见。与 System.Windows.Forms.Control 支持的许多事件的所有事件处理程序一样,它们都存储在单个 EventHandlerList 中。或 WPF 等效项 EventHandlersStore。

关于c# - 为什么事件需要委托(delegate)?为什么我们甚至需要事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10775540/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com