zoukankan      html  css  js  c++  java
  • 发布符合 .NET Framework 准则的事件

          (1)不生成事件数据。 .NET Framework 类库中的所有事件均基于EventHandler委托。EventHandler是一个预定义委托,当不生成数据随事件一起发送时,该委托无需声明,因为它已在创建 C# 项目时包含的System命名空间中进行了声明。

           EventHandler委托定义如下:

           //sender 是引发事件的对象
            //e 是不包含任何数据的事件数据对象。
            public delegate void EventHandler(object sender, EventArgs e);

           不生成事件数据直接声明如下:

            public event EventHandler RaiseCustomEvent;

          (2)生成事件数据,EventHandler委托第二个参数为EventArgs类派生类。

            EventArgs派生类定义如下:

        //在派生类中自定义保存事件数据所需的全部字段或属性
        public class CustomEventArgs : EventArgs
        {
            private string message;
            public string Message
            {
                set { message = value; }
                get { return message; }
            }
            public CustomEventArgs(string s)
            {
                message = s;
            }
        }

            然后声明委托,声明事件如下:

            public delegate void CustomEventHandler(object sender, CustomEventArgs e);
           public event CustomEventHandler RaiseCustomEvent;

          (3)生成事件数据,也可以使用.NET Framework 2.0 引入EventHandler的一个泛型版本EventHandler<TEventArgs>。使用泛型版本,不需声明委托。直接声明事件如下:

            public event EventHandler<CustomEventArgs> RaiseCustomEvent;

          (4)msdn符合.NET Framework 准则的事件实例。

        //该实例演示符合.net Framework规范的事件
        class NetFrameworkEvent
        {
            static void Main(string[] args)
            {
                Publisher pub = new Publisher();
                Subscrier sub1 = new Subscrier("sub1", pub);
                Subscrier sub2 = new Subscrier("sub2", pub);
    
                pub.DoSomething();
    
                Console.Read();
            }
        }
    
        public class CustomEventArgs : EventArgs
        {
            private string message;
            public string Message
            {
                set { message = value; }
                get { return message; }
            }
            public CustomEventArgs(string s)
            {
                message = s;
            }
        }
    
        //发行者
        public class Publisher
        {
    
            /*
             * 生成事件数据的第一种用法,
             * 自定义委托第二个参数为EventArgs的派生类。
               public delegate void CustomEventHandler(object sender, CustomEventArgs e);
               public event CustomEventHandler RaiseCustomEvent;
            */
    
            //生成事件数据的第二种用法,
            //直接用EventHandler的泛型版本声明事件,
            //该方法无需声明委托。
            public event EventHandler<CustomEventArgs> RaiseCustomEvent;
    
            public void DoSomething()
            {
                OnRaiseCustomEvent(new CustomEventArgs("Do something"));
            }
    
            protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
            {
    
                //CustomEventHandler handler = RaiseCustomEvent;
    
                EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
    
                if (handler != null)
                {
                    e.Message += string.Format(" at {0}", DateTime.Now.ToString());
                    handler(this, e);
                }
            }
        }
    
        //订阅者
        public class Subscrier
        {
            private string _id;
            public Subscrier(string id, Publisher pub)
            {
                _id = id;
                pub.RaiseCustomEvent += HandleCustomEvent;
            }
            private void HandleCustomEvent(object sender, CustomEventArgs e)
            {
                Console.WriteLine("{0} received this message: {1}", _id, e.Message);
            }
        }

       输出如下:

  • 相关阅读:
    [leetcode] Maximum Depth of Binary Tree
    [leetcode] Binary Tree Zigzag Level Order Traversal
    [leetcode] Binary Tree Level Order Traversal
    软工第二次极限测试
    动手动脑的问题以及课后实验性的问题3
    计算几何--半平面交与平面区域
    拉格朗日插值法
    计算几何--最小圆覆盖与最小球覆盖
    计算几何--圆与球
    程序员修炼之道读后感1
  • 原文地址:https://www.cnblogs.com/wanghonghu/p/2550068.html
Copyright © 2011-2022 走看看