C#事件演示程序2)——写事件的三点注意,以及常用的事件处理模型

本文主要是介绍C#事件演示程序2)——写事件的三点注意,以及常用的事件处理模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天又思考了一下C#的事件处理。
如果在一个类A中定义一个事件,在类B中触发事件,然后让订阅了类A的事件的类C执行对应的方法,该怎么办?
我试了一下,竟然不能执行:
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  ConsoleApplication3
{
    
class programm3
    
{
        
static void Main(string[] args)
        
{
            MyEvent myEvent 
= new MyEvent();
            aaa aaa 
= new aaa();
            myEvent.OnHehe();
        }

    }


    
public class aaa
    
{
        
public aaa()
        
{
            MyEvent myEvent 
= new MyEvent();   //注册给了另一个对象,所以不会被执行
            myEvent.hehe += new EventHandler(DisplayString);
        }

        
public void DisplayString(object sender,EventArgs e)
        
{
            Console.WriteLine(
"hello everyone!");
        }

    }


    
public class MyEvent
    
{
        
public event EventHandler hehe;

        
public void OnHehe()
        
{
            RaiseEvent();
        }

        
private void RaiseEvent()
        
{
            
if (hehe != null)
            
{
                hehe(
thisnew EventArgs());
            }

        }


    }


}

郁闷了半天,才终于弄清楚。原来原来我对C#的事件处理机制也仅仅是一知半解,不甚清楚。 
首先,定义事件的类,其定义的事件激活函数一般应该是非静态的(能否静态再研究),这就要求在外部触发事件,肯定首先要拿到该对象的实例。然后,对事件的注册是注册某个对象的事件,还有,就是包含处理动作的类一定要被加载,不然会找不到该类的。以上三点是写C#的事件非常容易倏忽的地方。但以上例子都注意了,怎么还是不行呢?原因很简单,注册针对的对象和被触发事件的对象不是一个对象!
所以,如果要实现目的,一般应该这样写:
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  ConsoleApplication3
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            MyEvent myEvent 
= MyEvent.Instance;

            Test test 
= new Test();

            myEvent.OnHaha();
            
        }

    }


    
public class Test
    
{
        
public Test()
        
{
            MyEvent.Instance.Haha 
+= new EventHandler(DisplayString);
        }


        
public void DisplayString(object sender, EventArgs e)
        
{
            Console.WriteLine(
"hello !");
        }

    }


    
public class MyEvent
    
{
    
//使用单例,保证外面的引用是同一个对象
        private static MyEvent _instance = new MyEvent();
        
public static MyEvent Instance
        
{
            
get return _instance; } 
        }


        
public event EventHandler Haha;

        
public void OnHaha()
        
{
            RaiseHaha();
        }

        
private void RaiseHaha()
        
{
            
if( Haha!=null )
            
{
                Haha(
thisnew EventArgs());
            }

        }

    }

}

这篇关于C#事件演示程序2)——写事件的三点注意,以及常用的事件处理模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853941

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

PyQt6 键盘事件处理的实现及实例代码

《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录一、键盘事件处理详解1、核心事件处理器2、事件对象 QKeyEvent3、修饰键处理(1)、修饰键类