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

标签 c# wpf winforms

过去几周我一直对事件感到困惑。我了解代表的工作方式,不是详细工作方式,但足以了解 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/

相关文章:

c# - 无法使用 MS .NET 运行时运行 GTK# 应用程序,只能使用 Mono 运行

c# - 从 WinForms 中的 `ImageList` 迁移到 WPF

c# - WinRT 中的 System.Reflection.Assembly.GetExecutingAssembly()

c# - View 页面的 Xamarin.Forms 单元测试因静态资源而失败

c# - 是否可以在回发时伪造查询字符串?

.net - 为什么 GetMessageW 会在我的 WPF 应用程序中占用大量 CPU 使用率?

c# - Prism 实际上为开发人员提供了什么?值得吗?

wpf - 如何在 ItemsControls 中使用 AlternationIndex?

c# - 在devexpress图表中找到两个系列的重叠点

c# - 服务器应用程序如何检查客户端应用程序是否在线?