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

相关文章

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程