1、声明一个委托类

public delegate SomethingChangedHandler(object sender,EventArgs e);
2、在你的类中声明一个事件绑定到该委托 public event SomethingChangedHandler Changed;
3、在相应的方法中触发此事件
public void ChangeSomething()
{

Changed(this,new EventArgs); //触发事件

}

4、在调用者订阅事件
your class's instance.Changed+=new SomethingChangedHandler(你的方法名);

5、取消订阅
订阅该事件的对象.Changed-=new SomethingChangedHandler(你的方法名);

注意:因为c#中事件是通过委托实现的,而委托不能被继承,所以导致事件只能在其定义的类中按事件名(该事件委托的参数...) 的形式触发。如果一个事件需要在派生类中被触发,可以在基类中定义一个触发该事件的方法 SendSomeEvent(),派生类中重写该方法,并调用base.SendSomeEvent();

看下面的实例:

namespace ConsoleApplication3
{
    class 出版社                                                         //定义出版社类
    {
        public delegate void 出版();                             //声明事件所需的代理
        public event   出版 已经出版;                           //事件的声明
        public void 发行()                                            //触发事件的方法
        {
            Console.WriteLine("发行刊物");
            已经出版();
        }
    }
    class 订阅者                                                       //定义订阅者类
    {
        public void 订阅()                           
        {
            Console.WriteLine("订阅者已经订阅");
        }
    }
    class Program
    {

static void Main(string[] args)
        {
            出版社 甲出版社=new 出版社();
            订阅者 张三=new 订阅者();
            甲出版社.已经出版+=new 出版社.出版(张三.订阅);     //向事件发行者订阅一个元事件
            甲出版社.发行();                                                        //触发事件
         }
    }
}

using System;

public class Publisher //出版社
{
public delegate void Publish(string name); //声明事件所需的代理
public event Publish OnPublish; //事件的声明
public void issue(string _name) //触发事件的方法
{
    if (OnPublish != null)
    {
      Console.WriteLine("发行刊物");
      OnPublish(_name);
    }
}
}

class Subscriber //订阅者
{
public void Receive(string str) //定义事件处理程序
{
    Console.WriteLine("订阅者" + str + "已经收到了刊物!");
}
}

class story
{
static void Main()
{
    Publisher Pub = new Publisher();
    Subscriber zs = new Subscriber();
    Pub.OnPublish += new Publisher.Publish(zs.Receive);
    Pub.issue("张三"); //触发事件
}
}

C#事件-自定义事件的使用方法(转载)的更多相关文章

  1. 如何给ActiveX控件添加“事件”“属性”“标准事件”“自定义事件”等一些相关操作

    上一篇小编带大家熟悉了一下ActiveX的建立以及相关的概念,(http://blog.csdn.net/u014028070/article/details/38424611) 本文介绍下如何给控件 ...

  2. 主动触发事件 自定义事件 trigger 及其用法

    1. 触发自定义事件方式 js.jq 2. jq 触发 2.1 默认支持的事件 $('#h').on('click',function(){ $(this).append('<p>p< ...

  3. Java的事件自定义事件学习

    课程设计要做一个游戏,由于对C++不是很熟悉,老师也准许使用java 或者其他的语言,在.net我学过事件,一种委托回调,但是在java 我不是很了解,应该原理都相同吧! 游戏大致是这样的,现在这在写 ...

  4. js原生创建模拟事件和自定义事件的方法

    让我万万没想到的是,原来<JavaScript高级程序设计(第3版)>里面提到的方法已经是过时的了.后来我查看了MDN,才找到了最新的方法. 模拟鼠标事件MDN上已经说得很清楚,尽管为了保 ...

  5. javascript和jquey的自定义事件小结

    “通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用 ...

  6. 【教程】【FLEX】#003 自定义事件、模块间通讯

    本篇笔记,主要阐明 事件是如何创建 和 如何使用自定义事件达到模块之间通讯 的效果. 句子解释: 什么叫做模块之间的通讯呢?? 简单点说,就是两个模块之间可以互相传数据. A模块 可以接收到 B模块的 ...

  7. jQuery事件命名空间多事件绑定自定义事件js 命名空间 javascript命名空间

    http://blog.csdn.net/pigpigpig4587/article/details/24727791 jQuery事件命名空间 jQuery支持事件命名空间,以方便事件管理.例如,在 ...

  8. Spring Boot(六)自定义事件及监听

    事件及监听并不是SpringBoot的新功能,Spring框架早已提供了完善的事件监听机制,在Spring框架中实现事件监听的流程如下: 自定义事件,继承org.springframework.con ...

  9. Spring容器事件、自定义事件

    Spring容器内置事件,如容器的启动.停止.关闭.销毁等事件 <bean name="contextStartedHandler" class="com.nuts ...

随机推荐

  1. iOS 11 安全区域适配

    //解决iOS11,仅实现heightForHeaderInSection,没有实现viewForHeaderInSection方法时,section间距大的问题 [UITableView appea ...

  2. Integer引用类型问题

    public class TestMain { public static void main(String[] args) { Integer integer = 2; go(2); System. ...

  3. mysql分裤分表

    1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表mem ...

  4. 新公司官网项目优化实践(Vue)

    入职后接手website-html和website-mobile项目,发现项目加载速度不太理想,于是结合自己之前的经验对项目做了优化.此篇文章主要记录这次优化详情. 原始项目:开发环境:website ...

  5. 如何限制jenkins的任务在某个节点上执行

    1.首先给节点打标签,一个节点可以打多个标签,中间使用空格分开 2.其次在每个任务上标记执行的标签位置,这样这个任务就在包含这些标签的节点上执行 3.通过这个方法限制的任务,只会跑在指定节点上,即是当 ...

  6. shell学习:几道常见shell习题

    1. 编写shell脚本,计算1-100的和: #! /bin/bash sum=0 for i in `seq 1 100`; do sum=$[$i+$sum] done echo $sum 计算 ...

  7. 【Linux】shell判断mysql端口是否启用?

    #!/bin/bash set -eux mysqld >& & CONNECTED=$(netstat -alnt | grep -c ":3306 ") ...

  8. jsp页面数据回显(select下拉选择框)

    1.静态变量方式: <!-- 实现select标签回显 --> 1.<select name="curStatus" value="${curStatu ...

  9. Microsoft.VisualStudio.Shell.14.0.dll 文件位置

    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Platform\Shel ...

  10. TestNG 八 并发测试

    一. Concurrenttesting: 下面的例子是输出进程ID,threadPoolSize用来指明线程池的大小,也就是并发的线程数目是多少 5次调用,有3个线程可调用 @Test(invoca ...