`
v5browser
  • 浏览: 1136852 次
社区版块
存档分类
最新评论

c# 委托 事件 EventHandler 观察者模式 详解,以及和java的比较

 
阅读更多


C#和java比较: java中使用的是接口。

C#使用委托机制,可以用时 + 运算符进行注册,直接多播。 而java中是一般是使用一个集合来保存观察者。


发布者(Publisher)= 被观察者 (Observable) = 事件源(java中的EventObject,C#中的sender)

订阅者(Subscriber)=观察者(Observer) = 接收者(java中继承EventLister,接口, 或Observer接口, C#由于委托机制,不需要继承接口,直接按EventHandler实现回调方法


在发生其他类或对象关注的事情时,或对象可通过事件通知它们。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。

在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引发的事件。可使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件。IDE 会自动添加空事件处理程序方法和订阅事件的代码。


EventHandler为C#中的预定义委托,专用于表示不生成数据的事件的事件的处理程序方法。

public delegate void EventHandler(
	Object sender,
	EventArgs e
)

事件概述

事件具有以下特点:

  • 发行者确定何时引发事件,订户确定执行何种操作来响应该事件。

  • 一个事件可以有多个订户。一个订户可处理来自多个发行者的多个事件。

  • 没有订户的事件永远不会被调用。

  • 事件通常用于通知用户操作(如:图形用户界面中的按钮单击或菜单选择操作)。

  • 如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。要异步调用事件,请参见使用异步方式调用同步方法

  • 可以利用事件同步线程。

  • 在 .NET Framework 类库中,事件是基于EventHandler委托和EventArgs基类的。

看下面的代码,比较详细了!

下面的示例演示了上述步骤,它将自定义 EventArgs 类和EventHandler<T>用作事件类型。

MSDN的实例还不错,直接拿来用了。给翻译了一下,重点部分已注释!

namespace ConsoleApplication2
{
    using System;
    using System.Collections.Generic;

    // 自定义一个事件类来保存事件信息
    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            message = s;
        }
        private string message;

        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }

    // 广播事件的类
    class Publisher
    {

        // 使用 EventHandler<T> 声明一个事件
        public event EventHandler<CustomEventArgs> RaiseCustomEvent;

        //这个方法是做了一些事情。 然后触发一个事件。
        public void DoSomething()
        {
            //DoSomething…………
            // 你也可以再触发事件前,执行一些其他的代码
            OnRaiseCustomEvent(new CustomEventArgs("Did something,hi 这是事件消息"));

        }

        
        //使用虚方法,让子类可以重写。 to allow derived classes to override the event invocation behavior
        protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
        {
            // 定义一个局部变量,已防止最后一个订阅者刚好在检查null后取消订阅
            EventHandler<CustomEventArgs> handler = RaiseCustomEvent;

            // 如果没有 订阅者(观察者), 委托对象将为null
            if (handler != null)
            {
                // 格式化事件消息中 的字符串
                e.Message += String.Format(" at {0}", DateTime.Now.ToString());

                // 这是最重要的一句。
                // 此时执行的  handler已经是一个多播委托(如果有多个订阅者或观察者注册)。
                // 既然是多播委托,就可以依次调用各个 回调函数 (既然是回调函数,实际的执行就由订阅者类决定)。
                //这里面传入一个this, 就代表 事件源(或发布者 或 被观察者 都一个意思)
                handler(this, e);

            }
        }
    }

    //用来注册事件的类
    class Subscriber
    {
        private string id;
        public Subscriber(string ID, Publisher pub)
        {
            id = ID;

            // 注册事件,使用C#2.0语法
            //注册这个动作,应该有订阅者主动进行,并且可以再后期取消注册
            pub.RaiseCustomEvent += HandleCustomEvent;
        }


        // 实现回调函数。 在事件发生后,执行什么样的操作。这里只是简单的打印信息。
        void HandleCustomEvent(object sender, CustomEventArgs e)
        {
            //这就是实际的操作。
            Console.WriteLine(id + " received this message: {0}", e.Message);
        }
    }

    class Class1
    {
        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub1 = new Subscriber("sub1", pub);
            Subscriber sub2 = new Subscriber("sub2", pub);

            // 调用这个方法来产生事件
            pub.DoSomething();

            // Keep the console window open
            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();

        }
    }

    
}




分享到:
评论

相关推荐

    C# 中的EventHandler实例详解

    C# 中的EventHandler实例详解

    asp.net中c#自定义事件的实现方法详解

    c#自定义事件分为六步,声明关于事件的委托,声明事件,编写引发事件的函数,事件处理,这里我们就来具体的介绍一下。 C#自定义事件的具体实现步骤如下: 1、声明一个delegate: (用于事件的类型的定义) 如: 代码如下...

    C# 中的委托和事件

    .Net Framework的编码规范: 委托类型的名称都应该以EventHandler结束。 委托的原型定义:有一个void返回值,... 事件的命名为 委托去掉 EventHandler之后剩余的部分。 继承自EventArgs的类型应该以EventArgs结尾。

    浅析C# 中object sender与EventArgs e

    在写代码前我们先来熟悉.net框架中和事件有关的类和委托,了解C#中预定义事件的处理。 EventArgs是包含事件数据的类的基类,用于传递事件的细节。 EventHandler是一个委托声明如下 public delegate void ...

    浅析C#中object sender与EventArgs e

    在写代码前我们先来熟悉.net框架中和事件有关的类和委托,了解C#中预定义事件的处理。 EventArgs是包含事件数据的基类,用于传递事件的细节。 EventHandler是一个委托声明如下 public delegate void EventHandler...

    C#事件处理和委托event delegate实例简述

    本文实例讲述了C#事件处理和委托event delegate,分享给大家供大家参考。具体方法如下: 以下仅仅是用最简单的方式表示事件,实际应用可能是不同窗体之间相互通知某些操作,达到触发。 首先声明一个degate的 ...

    C#事件访问器详解

    我们可以通过为事件定义事件访问器,来控制事件运算符+=、-=运算符的行为 •有两个访问器:add和remove•声明事件的...}声明了事件访问器后,事件不包含任何内嵌委托对象.我们必须实现自己的机制来存储和移除事件的方法

    Learn-Events-Delegates-And-Lambdas:来自 PluralSight C# 事件、委托和 Lambda

    来自 PluralSight C# 事件、委托和 Lambda 模块 1 - 事件、委托和事件处理程序 事件 - 发送给订阅者的通知 (Button_Click) 鼠标按下触发点击事件。 多个对象可以通过订阅事件来监听一个事件通过EventArgs(事件...

    C#事件处理.txt

    学习事件,我觉得最不好理解的就是C#中预定义了事件,使我才开始学习事件时一头雾水。在查了些资料后,终于弄明白了一些,如下:EventArgs是包含事件数据的类的基类,用于传递事件的细节。 EventHandler是一个委托声明...

    C#事件处理示例-源码

    阐述委托与事件的联系。EventHandler的使用,是写基础知识

    C#编写了一个定时小工具

    是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler。在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题–因为这种Timer实际上就是在UI线程...

    C#基础之泛型委托实例教程

    首先,泛型委托是委托的一种特殊形式,虽然感觉看上去比较怪异,其实在使用的时候跟委托差不多,不过泛型委托更具有类型通用性。 就拿C#里最常见的委托EventHandler打比方。在.NET 2.0以前,也就是泛型出现以前,...

    C# 使用匿名函数解决EventHandler参数传递的难题

    首先,动态生成PictureBox,很简单, ... 然后,要给右键菜单增加“删除”项,并实现删除图片事件。这个,比较麻烦。 MenuItem item = new MenuItem(“删除”) ; menu.MenuItems.Add( item , new EventHandler( it

    EventHandling:比Java Events和EventListeners更易于使用和理解的事件处理

    它仍然是必需的,并且对于键盘和鼠标事件很有用,但是自定义编写的任何内容都很难正常工作。 要使用此事件处理系统,有3件事要开始。 new EventControlPanel(); 该行初始化事件管理系统。 有关如何编写新事件,...

    eventHandler学习视频

    moss2007 详细介绍eventhandler 使用方法 该视频一看就会

Global site tag (gtag.js) - Google Analytics