当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

c#中事件Event声明和触发,以及自定义事件委托和系统委托EventHandler

秋天2年前 (2022-05-09)C#/.net框架594



C#
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 事件1{
    class Program
    {
        static void Main(string[] args)
        {
            myChangedEvent mce = new myChangedEvent();
            myEventListener mel = new myEventListener(mce);
            mce.ToString();
            mel.detach();
            mce.ToString();
        }
    }

    public delegate void myEventHandler(object s,EventArgs e);//声明自定义的事件委托,用来执行事件的声明,和处理方法的传递

    class myChangedEvent
    {
        public event myEventHandler Changed;//利用委托来声明事件
        protected virtual void OnChanged(EventArgs e)//声明事件触发的方法
        {
            if (Changed != null)
                Changed(this, e);//触发事件
        }

        public override string ToString()
        {
            OnChanged(EventArgs.Empty);//调用事件触发方法
            return "执行ToString";
        }
    }
    class myEventListener//声明事件监听的类型,并为以上声明事件传入处理方法
    {
        private myChangedEvent mce;
        public myEventListener(myChangedEvent Mce)
        {
           mce = Mce;//利用构造函数,获得对象的引用
           mce.Changed+=new myEventHandler(ListenerChanged);//为其事件添加自定义的处理方法
        }
        private void ListenerChanged(object s,EventArgs e)//声明一个符合事件委托签名的处理方法
        {
            Console.WriteLine("已经触发事件!");
        }
        public void detach()
        {
            mce.Changed -= new myEventHandler(ListenerChanged);
        }
    }}

事件的声明过程

1.存在已经声明的事件委托,该委托位于namespace下,可全局访问

C#
namespace 命名空间{
  publice delegate void 事件委托(object sender,EventArgs e);  
  class 类1{/*....*/}  
  class 类2{/*....*/}}

2.在数据类型中利用event和事件委托来声明事件,并声明事件触发方法

C#
class 类1{
      public event 事件委托类型 事件名称;
      protected virtual void 触发事件(EventArgs e)
        {
            if (事件名称 != null)
                事件名称(this, e);
        }}

3.事件绑定,利用事件声明的对象实例,声明符合事件委托签名的方法,利用+=或-=来进行事件的绑定和解除

C#
{
 
  类1 类1变量=new 类1();
  类1变量.事件名称+=new 事件委托类型(事件处理方法);
 }/*...*/public void 事件处理方法(object sender,EventArgs e){
  /*处理过程*/}

4.事件触发,代码利用事件声明中的触发事件的方法即可

 

注意:.Net提供自带的事件委托类型EventHandler(msdn:http://msdn.microsoft.com/zh-cn/library/system.eventhandler.aspx)

利用EventHandler,可以直接声明对象事件,免去自定义委托的声明

C#
public event EventHandler 事件名称;


#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。

扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=123

标签: .NET.NET框架
分享给朋友:

“c#中事件Event声明和触发,以及自定义事件委托和系统委托EventHandler” 的相关文章

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

请看演示程序。我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。下面例子中,你无法这样写:            if(res1==null)        &nbs...

C#字符串与享元(Flyweight)模式

C#字符串与享元(Flyweight)模式

注:关注这个话题是因为看到C#的关键字 lock时,其传入引用对象。因为string也是引用对象,所以能否做为lock的参数?对于这个问题,要搞明白C#的字符串的一个特点,它使用类似于享元模式的机制。因此在lock中锁字符串是相当不安全的。下面贴子是对C#字符串与享元模式的深入讨论。写这个文章,主要...

C# tableLayoutPanel动态加载控件闪烁的解决方案

C# tableLayoutPanel动态加载控件闪烁的解决方案

WinForm加载多个自定义控件时,会出现很严重的闪烁问题,很卡,一块一块的加载(像打开网页时,网络很卡的那种感觉)简直没法忍受。在网上搜索了好久,网上大部分的方法是一下4种,但是都不能有效的解决问题。  1.将DoubleBuffered 设置 true,用双缓存处理Form界面内容加载,可以提高...

C#测量程序运行时间及cpu使用时间

C#测量程序运行时间及cpu使用时间

对一个服务器程序想统计每秒可以处理多少数据包,要如何做?答案是用处理数据包的总数,除以累记处理数据包用的时间。这里要指出的是, 运行一段程序,使用的cpu时间,跟实际运行的时间是不一样的。附例如下:C#private void ShowRunTime() {...

关于C#项目引用的一点经验

关于C#项目引用的一点经验

关于项目引用,有几种:(一)这种是引用系统的程序集(二)下面这种是引用你自己的项目“解决方案”(三)最后一种是浏览本机上的项目的dll。对于工程中有几十个项目的软件来说,虽然使用(二)是很方便。但是会编译速度奇慢,而且随着项目越多越慢。貌似他run之前都会把所有项目都试图更新一下。勇哥宿舍的电脑,实...

C# 查询运算符测试

C# 查询运算符测试

测试一下全部的查询运算符。每天测试一部分,代码会持续更新中……C#using System;using System.Collections;using System.Collections.Generic;using System.Linq;using&nb...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。