C# Events

2022-08-30  本文已影响0人  Ritchie_Li

Parameter             Details

EventArgsT         The type that derives from EventArgs and contains the event parameters.

EventName         The name of the event.

HandlerName     The name of the event handler.

SenderObject     The object that's invoking the event.

EventArguments An instance of the EventArgsT type that contains the event parameters.

事件发生触发某些行为,如鼠标单击,触发Click Event,或者某情况下触发的通知,如价格变化。类可以定义事件并且它们的实例(对象)可以引发这些事件。 例如,一个 Button 可能包含一个当用户单击它时引发的单击事件。事件是由对象发送的通知,用于表示某个动作的发生。 .NET 中的事件遵循观察者设计模式。

引发事件的类称为发布者,接收通知的类称为订阅者。 单个事件可以有多个订阅者。 通常,发布者会在某些操作发生时引发事件。 有兴趣在动作发生时获得通知的订阅者应该注册一个事件并处理它。

在C#中,事件是封装的委托。 它取决于委托。 委托定义订阅者类的事件处理程序方法的签名。

1. 声明事件

先声明一个委托,在使用event关键字声明委托变量。

    public delegate void Notify(); // delegate

    //Declaring an Event

    public class MyTestClass

    {

        public event Notify ProcessCompleted; // event

    }

在上面的示例中,我们声明了一个委托 Notify,然后在 MyTestClass 类中使用“event”关键字声明了委托类型 Notify 的事件 ProcessCompleted。 因此,MyTestClass 类称为发布者。 Notify 委托指定 ProcessCompleted 事件处理程序的签名。 它指定订阅者类中的事件处理程序方法必须具有 void 返回类型并且没有参数。

    public void StartProcess()

        {

            Console.WriteLine("Process Started!");

            // some code here..

            OnProcessCompleted();

        }

        protected virtual void OnProcessCompleted() //protected virtual method

        {

            //if ProcessCompleted is not null then call delegate

            ProcessCompleted?.Invoke();

        }

上面,StartProcess() 方法最后调用了 onProcessCompleted() 方法,从而引发了一个事件。 通常,要引发事件,应使用名称 On<EventName> 定义受保护的虚拟方法。 protected 和 virtual 使派生类能够覆盖引发事件的逻辑。 但是,派生类应始终调用基类的 On<EventName> 方法,以确保已注册的委托接收事件。

OnProcessCompleted() 方法使用 ProcessCompleted?.Invoke(); 调用委托。 这将调用使用 ProcessCompleted 事件注册的所有事件处理程序方法。订阅者类必须注册到 ProcessCompleted 事件,并使用签名与 Notify 委托匹配的方法进行处理。

2.  注册事件

namespace ConsoleApp

{

    class Program

    {

        //Consume an Event

        static void Main(string[] args)

        {

            MyTestClass test1 = new MyTestClass();

            test1.ProcessCompleted += Test1_ProcessCompleted;//register with an event

            test1.StartProcess();

        }

        private static void Test1_ProcessCompleted()

        {

            Console.WriteLine("Process Completed!");

        }

    }

}

输出:

Process Started!

Process Completed!

上一篇下一篇

猜你喜欢

热点阅读