吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3849|回复: 4
收起左侧

[其他转载] 【笔记】C# 标准的事件定义,订阅以及取消订阅源码

[复制链接]
葬礼昨天 发表于 2017-1-6 12:51
比较简洁易懂的简单事件源码(自用)

[C#] 纯文本查看 复制代码
using System;


namespace ConsoleApplication1
{
    //发布事件的类start

    public class TestEventSource
    {

        //定义事件参数类

        public class TestEventArgs : EventArgs
        {

            public readonly char KeyToRaiseEvent;

            public TestEventArgs(char keyToRaiseEvent)
            {

                KeyToRaiseEvent = keyToRaiseEvent;

            }

        }

        //定义delegate

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

        //用event 关键字声明事件对象

        public event TestEventHandler TestEvent;

        //事件触发方法

        protected virtual void OnTestEvent(TestEventArgs e)
        {

            if (TestEvent != null)

                TestEvent(this, e);

        }

        //引发事件

        public void RaiseEvent(char keyToRaiseEvent)
        {

            TestEventArgs e = new TestEventArgs(keyToRaiseEvent);

            OnTestEvent(e);

        }

    }

    //发布事件的类end

    //监听事件的类start

    public class TestEventListener
    {

        //定义本地处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型

        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);

        }

    }

    //监听事件的类end

    //测试类start

    public class Test
    {

        public static void Main()
        {

            //创建事件源对象

            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]);

        }

    }

    //测试类end
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

我是逍遥 发表于 2017-1-6 13:55
帖子不错。顶一下
psx1lin 发表于 2017-3-4 23:14
Junle 发表于 2017-11-12 21:13
newpowersky 发表于 2018-2-3 11:04
这个要记一下!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 14:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表