C# 事件简单使用

事件采用发布/订阅模型,其中发布者决定在什么情况引发事件,而订阅者决定为响应事件而执行的操作。事件可以有多个订阅者,此时,将在事件被触发是同步调用事件处理程序。如果事件没有订阅者,将不会引发。订阅者可处理来自多个发布者的多个事件。

事件是一种回调,可以将方法作为参数传递给另一个参数,在C#中,这种回调被称为委托。事件处理程序不过是通过委托调用的方法,这类似于C/C++中函数指针。委托类型定义了一个方法签名,可将任何具有兼容签名的方法与委托向关联。

废话不多说直接上代码

    /// <summary>
    /// 自定义事件委托,将 数据(此处只有data) 传递给订阅者
    /// 定义此类,纯粹是为了传递数据
    /// </summary>
    public class CustomerEventArgs : System.EventArgs
    {
        private readonly string _data;

        public string Data { get { return _data; } }

        public CustomerEventArgs(string str)
        {
            this._data = str;
        }
    }

    // 事件的发布者Contact
    public class Contact
    {
        //两个都是发布事件
        public event EventHandler<CustomerEventArgs> DataChanged;
        //public event EventHandler DataChangedAgain;   //此事件就是没有使用自定义数据

        // 定义事件引发方法
        protected virtual void OnDataChanged(CustomerEventArgs e)
        {
            EventHandler<CustomerEventArgs> hander = DataChanged;

            if (hander != null)
            {
                hander(this, e);
            }

            // 简化调用,与上面的作用一样
            // DataChanged?.Invoke(this, e); 
        }

        public string Data
        {           
            set
            {                
                CustomerEventArgs arg = new CustomerEventArgs(value);
                this.OnDataChanged(arg);
            }
        }

        public override string ToString()
        {
            return "This is Contact,the data has changed to : ";
        }
    }

    public class EventTest
    {
        /// <summary>
        /// 订阅者
        /// </summary>
        /// <param name="sender">事件引发者</param>
        /// <param name="e">自定义传递参数</param>
        public void DoSomething(Object sender, CustomerEventArgs e)
        {
            Console.WriteLine(sender.ToString() + e.Data);
        }

        public void Test()
        {
            var contact = new Contact();
            contact.DataChanged += DoSomething; //订阅事件
            var words = Console.ReadLine();
            contact.Data = words;
        }
    }

还是,稍微说一下使用的步骤吧,方便以后理解。

首先,事件使用的委托是: EventHandler

使用事件的步骤:
1、确定是否需要自定义数据,需要则从System.EventArgs派生新类
2、创建事件发布者类Contact,并发布事件:public event EventHandler DataChanged
3、在发布者类定义引发事件
4、创建订阅者(定义响应函数)
5、订阅事件 contact.DataChanged += DoSomething;
6、触发事件

附上结果图一张:
输入new string

另外,可以在DoSomething方法内打个断点,看是否有进入这响应函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值