该程序为一个简单的事件发布、订阅、监听和触发的示例程序,主要涉及的类、字段、方法和语句如下:

  1. 'TestEventSource' 类:事件源类,定义了 'TestEventArgs' 类、'TestEventHandler' 委托和 'TestEvent' 事件,以及 'RaiseEvent' 方法。

  2. 'TestEventArgs' 类:继承自 'EventArgs' 类,定义了一个只读的字符类型字段 'KeyToRaiseEvent',表示要触发的事件的参数。

  3. 'TestEventHandler' 委托:定义了一个方法签名,接收两个参数,一个是 'object' 类型的事件源对象 'sender',另一个是 'TestEventArgs' 类型的事件参数 'e'。

  4. 'TestEvent' 事件:使用 'TestEventHandler' 委托类型作为事件类型,表示当事件被触发时所要执行的方法列表。

  5. 'RaiseEvent' 方法:接收一个字符类型的参数 'keyToRaiseEvent',创建一个 'TestEventArgs' 对象,并通过 'TestEvent' 事件触发该事件。

  6. 'TestEventListener' 类:事件监听器类,定义了 'KeyPressed' 方法、'Subscribe' 方法和 'UnSubscribe' 方法。

  7. 'KeyPressed' 方法:是一个事件处理程序,接收两个参数,一个是 'object' 类型的事件源对象 'sender',另一个是 'TestEventArgs' 类型的事件参数 'e',用于处理 'TestEvent' 事件被触发时所要执行的逻辑。

  8. 'Subscribe' 方法:接收一个 'TestEventSource' 类型的参数 'evenSource',将自身的 'KeyPressed' 方法添加到 'evenSource' 的 'TestEvent' 事件的方法列表中,表示订阅该事件。

  9. 'UnSubscribe' 方法:接收一个 'TestEventSource' 类型的参数 'evenSource',将自身的 'KeyPressed' 方法从 'evenSource' 的 'TestEvent' 事件的方法列表中移除,表示取消订阅该事件。

  10. 'Main' 方法:程序的入口,创建 'TestEventSource' 对象和 'TestEventListener' 对象,然后通过 'TestEventListener' 对象订阅 'TestEventSource' 对象的 'TestEvent' 事件并触发该事件,最后再取消订阅该事件并再次触发该事件。

namespace Homework
{
    public class TestEventSource
    {
        public class TestEventArgs : EventArgs
        {
            public readonly char KeyToRaiseEvent;

            public TestEventArgs(char keyToRaiseEvent)
            {
                KeyToRaiseEvent = keyToRaiseEvent;
            }
        }

        public delegate void TestEventHandler(object sender, TestEventArgs e);

        public event TestEventHandler TestEvent;

        public void RaiseEvent(char keyToRaiseEvent)
        {
            TestEventArgs e = new TestEventArgs(keyToRaiseEvent);

            if (TestEvent != null)
                TestEvent(this, e);
        }
    }

    public class TestEventListener
    {
        public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
        {
            Console.WriteLine('发送者:{0},所按得健为:{1}', sender, e.KeyToRaiseEvent);
        }

        public void Subscribe(TestEventSource evenSource)
        {
            evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
        }

        public void UnSubscribe(TestEventSource evenSource)
        {
            evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            TestEventSource es = new TestEventSource();
            TestEventListener el = new TestEventListener();

            Console.WriteLine('订阅事件\n');
            el.Subscribe(es);

            Console.WriteLine('输入一个字符,再按enter键');
            string s = Console.ReadLine();

            es.RaiseEvent(s.ToCharArray()[0]);

            Console.WriteLine('\n取消订阅事件\n');
            el.UnSubscribe(es);

            Console.WriteLine('输入一个字符,再按enter健');
            s = Console.ReadLine();

            es.RaiseEvent(s.ToCharArray()[0]);
        }
    }
}

通过以上示例程序,可以更清晰地理解事件发布、订阅、监听和触发机制在 C# 中的应用。

C# 事件发布、订阅、监听和触发示例程序解析

原文地址: https://www.cveoy.top/t/topic/nryP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录