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#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应