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

相关文章

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee