.NET 中自定义事件的驱动(C#)

C#事件机制深度解析:从委托封装到安全事件驱动编程 在面向对象编程中,委托是实现方法回调和多播通知的核心机制,它允许将方法作为参数传递和间接调用。然而,直接暴露委托字段会破坏封装性,导致外部代码可以随意覆盖、调用或清空订阅,引发不可预测的行为。C#事件正是为解决这一问题而设计的语法糖,它在委托基础上添加了访问限制,对外仅暴露订阅和退订接口,将调用和赋值的控制权保留在类内部,从而确保了类型安全和封装原则。这种机制是构建松耦合、健壮的事件驱动系统的基石,广泛应用于GUI开发、异步通知和状态机等场景。通过标准事件模式(EventHandler与EventArgs) 阅读详情

在Windows应用的开发过程中,常常会借助Windows的事件驱动机制,自己定义事件,使应用程序的具有更好的封装。特别是在基于组件的应用开发中,更能体现其优越性。当然在MFC中自定义事件是很容易的一件事,但在C#中有其特有的定义模式。

    首先定义事件是很容易的一件事,但光定义了事件,而不驱动这个事件,那么事件的定义就毫无意义。文章通过几个实例来描述C#中自定义事件及其驱动机制。

    事件的驱动方式不同有几种:1、成员中直接驱动;2、属性变动时驱动。下面举例分别说明它们的使用方法。

 

  实例1 :成员中直接驱动(参考1)

// Step-1: 首先定义一个新的 EventArgs ,其中包括一个属性,用于传送超过100的结果值 
// 要注意的是:该类要继承自系统的 EventArgs 类。需要多个属性时定义方法与 HighValue 类似。 
class LevelHighArgs : EventArgs 
{ 
        int _highValue = 0; 

        public int HighValue 
        { 
            get { return _highValue; } 
            set { _highValue = value; } 
        } 

        public LevelHighArgs(int _highValue) 
        { 
            this._highValue = _highValue; 
        } 
} 
     
  // Step-2: 处理类。在该类中定义委托,和事件处理方法。 
  class AddTowInt 
  { 
       // 委托定义 
        public delegate void LevelHigh(object sender, LevelHighArgs e); 
       // 委托类型的事件处理方法 
        public event LevelHigh OnLevelHigh; 

        int _addedValue = 0; 
        public int AddedValue 
        { 
            get { return _addedValue; } 
            set { _addedValue = value; } 
        } 

        public AddTowInt() 
        { } 

        public void DoAdd(int a1, int a2) 
        { 
            _addedValue = a1 + a2; 

            if (_addedValue > 100) 
            { 
                LevelHighArgs lha = new LevelHighArgs(_addedValue - 100); 
                 
                // 在结果 > 100 时,抛出事件 
                OnLevelHigh(this, lha); 
            } 
        } 
 } 
     
    // 使用及事件的捕捉 
class Program 
{ 
        static void Main(string[] args) 
        { 
         // 计算程序对象 
            AddTowInt ati = new AddTowInt(); 
            // 注册事件处理程序 
            ati.OnLevelHigh += new AddTowInt.LevelHigh(ati_OnLevelHigh); 
            // 传送测试数据。此时结果为 101 会触发事件,可换成 23, 77 调用会看到事件没有触发。 
            ati.DoAdd(23, 78);    // 显示调用

            Console.WriteLine(ati.AddedValue); 

            Console.ReadLine(); 
        } 

        static void ati_OnLevelHigh(object sender, LevelHighArgs e) 
        { 
         // 此处 e 中可以看到有一个 HighValue 属性,该值就是我们定义在 LevelHighArgs 中的属性 
            Console.WriteLine("结果已经超过 100: " + e.HighValue); 
        } 
}
  实例2: 成员中直接驱动(参考2)

//文件名:ChatServer.cs
public class ChatServer
{
   public delegate void MyEventHandler(string msg);
   public event MyEventHandler onSendMsg;
   public void SendMsg()
   {
      onSendMsg("开始发送消息!");
   }
}

//  文件名:Form1.cs
///////////////////////////////////
//类事件的处理代码如下
private void SendMsgTest()
{
   //创建ChatServer类的实例
   ChatServer f_Server;
   f_Server = new Server();
   f_Server.onSendMsg += new Server.MyEventHandler(this.OnSendMsg);
   //调用 f_Server的SendMsg()函数
   f_Server.SendMsg();
}

//处理 onSendMsg 事件代码
protected void OnSendMsg(string msg)
{
    //输出调试信息
    Console.WriteLine(msg);
}
    实例3:属性变动时驱动(参考3)

namespace Test
{        
    class Program
    {
        static void Main(string[] args)
        {
            MonitoringNameChangement M = new MonitoringNameChangement();
            M.NameChanged += new NameChanged(M_NameChanged);
            while (true)
            {
                Console.WriteLine("请输入一个新的名字,您将会看到您自定义的事件会被执行");
                M.ChangeName = Console.ReadLine();
            }
        }

        static void M_NameChanged(string oldName, string NewName)
        {
            Console.WriteLine("******************************************* 名字已经改变");
            Console.WriteLine("新名字是: {0} 老名字是: {1}", NewName, oldName);
            Console.WriteLine("******************************************* ");
        }
    
    }
    //定义一个监控名字变化的委托
    public delegate void NameChanged(string oldName, string NewName);
    //定义一个名字监控类
    public class MonitoringNameChangement
    {
        private string name = "老名字";
        public string ChangeName{
            set
            {
                //如果输入的是全新的名字,则会调用监控名字的事件,并且存储新名字
                if (name != value)
                {
                    NameChanged(name, value);
                    name = value;
                }
            }
            get
            { 
                return name;
            }
        }
        //监控名字的事件
        public event NameChanged NameChanged;
    }
}


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/wonsoft/archive/2008/10/28/3169107.aspx

C#实现自定义事件(附完整源码) 阅读详情

相关推荐

C# Winform事件模拟实战源码解析.zip

本文还有配套的精品资源,点击获取 简介:本文深入探讨了如何利用C#和Windows Forms(Winform)应用程序模拟事件,并通过源代码示例展示C#中的事件处理。文章涵盖了事件模型、事件声明与引发、订阅与取消订阅、控件事件、匿名方法与Lambda表达式,以及源代码分析,以加深对Winform用户交互事件处理的理解。 1. C#事件模型简介 事件是C#中一种...

weixin_33072399的博客 1163

【C#与.net】6.0 事件驱动机制

1.0 事件 image.png 选中组件,在属性栏可以查看事件列表。 image.png 可以双击图形化的按钮,或者双击属性事件列表的click,都可以自动生成点击事件监听方法。 FormMain.cs private void InitializeComponent() { this.btnTest = new System.Windo...

我睡醒刚刚 217

C#便签应用源代码详解与实践

本文还有配套的精品资源,点击获取 简介:本源代码展示了一个使用C#和.NET开发的便签应用程序。该程序提供了一个简单的用户界面,支持数据持久化存储,并允许用户自定义便签的颜色和样式。它使用了事件驱动编程模型来响应用户操作,并具备多窗口管理、剪贴板集成以及通知提醒功能。开发者可以从中学习到C#编程、.NET框架应用以及桌面应用开发的各个方面。对于不同级别的开发者,这个项目都能...

weixin_34374684的博客 1143

.NET事件机制

一, 事件及事件驱动 1,事件的概念 软件事件是对现实生活中的事件的模拟。从面向对象的角度来说,事件是由对象发出的消息,它是一个信号,通知其他对象有事情发生。例如,单击窗体上的某个控件时,控件可能会激发一个Click事件。 激发与相应事件的载体都是对象。激发事件的对象被称为“事件源”,对这个事件进行响应的对象称为“响应者” 响应者必须提供一个“事件响应(或处理)方法”。 2...

dkld66315的博客 286

C#开发即时通讯自动化工具:MSN机器人实战教程

本文还有配套的精品资源,点击获取 简介:本教程介绍了如何使用C#构建MSN机器人的即时通讯自动化工具。通过C#的事件驱动模型和类库,结合外部开源动态库,开发者可以实现自定义聊天逻辑、自动回复消息和管理联系人等丰富功能。教程还解析了MSN协议的实现原理,并引导开发者通过案例学习实现各种机器人功能,如自动回复、联系人管理、群组聊天、文件传输和事件监听。 1. C#语言...

weixin_30205153的博客 1269

C#删除文件到回收站DEMO源码

C#删除文件到回收站DEMO源码 原理:调用shell32.dll内函数 SHFileOperation删除文件到回收站。实测通过。删除文件代码已封装为一个类,DEMO为控制台程序,可方便地将代码移植到您的项目中。

C#自定义控件添加事件例程

根据网络资源修改编写的一个进度条控件,主要是记录开发过程。 用户可以根据自己需要修改相应代码,或直接使用控件。也可以将代码作为子能够以控件的学习资料 写作目的主要是防止以后忘记。   编译环境 VS2010  C#    XP sp3 详细的DLL及源代码  还有测试程序请  下载地址 https://download.csdn.net/download/anlog/10935465 ...

anlog的专栏 2667

C自定义控件——Popup窗口提醒完整源码:实时提醒利器,让开发更简单

C#自定义控件——Popup窗口提醒完整源码:实时提醒利器,让开发更简单 去发现同类优质开源项目:https://gitcode.com/ C#自定义控件——Popup窗口提醒完整源码,为开发者提供了一种高效、灵活的即时提醒解决方案,适用于各种需要弹出窗口提醒的场景。 项目介绍 Popup窗口提醒控件,是针对Windows Forms应用程序设计的自定义控件,旨在帮助开发者在适当的时间和位置为用户...

gitblog_06722的博客 879

ABB机器人发送实时位置给PLC

本文使用中断方式实现,多任务要订购ABB功能包 Profinet总线组变量配置 注:映射为16位和32位均可用 声明数据 VAR num CurrentExAxisPos;!外轴位置 VAR robtarget pCurrentPos;!实时位置 var intnum TrapNum;!中断号 初始化开中断 IDelete TrapNum;!中断号 CONNECT TrapNum WITH iTrapCurPos;!连接中...

澍澍爸的blog 6776

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 394

P2P.NET 项目推荐

P2P.NET 项目推荐 项目基础介绍和主要编程语言 P2P.NET 是一个基于 C# 语言开发的点对点(Peer-to-Peer, P2P)网络通信项目。该项目利用 WebRTC 技术,旨在为开发者提供一个简单易用的 P2P 网络通信框架。C# 作为一种广泛应用于 Windows 平台的编程语言,具有强大的面向对象编程能力和丰富的库支持,使得 P2P.NET 在开发高效、可靠的 P2P 应用时表...

gitblog_00615的博客 526

cadence allegro 17.x 降版本到16.6的转换工具

Cadence17.x版本降低到16.6版本转换工具 下载链接:Cadence17.x版本降低到16.6版本转换工具   使用方法: 软件使用比较简单,在「第一个路径输入栏」浏览指向17.x的设计文件,也就是需要降版本的17.4或者17.2的文件,然后在「第二个路径输入栏」里浏览指向转换后的文件保存路径,然后点击「转换」按钮即可。 ...

ltqdxl的博客 1万+

FastReport脚本编程:利用C和VB.NET实现复杂业务逻辑

FastReport脚本编程是.NET报表开发中的强大功能,让开发者能够在报表中嵌入C#或VB.NET代码,实现动态数据处理、条件格式化、复杂计算和业务逻辑集成。通过脚本编程,你可以超越简单的数据绑定,创建高度定制化的智能报表解决方案。 ## 为什么需要FastReport脚本编程? 传统报表工具通常只提供静态数据展示,但实际业务场景往往需要动态计算、条件判断和数据转换。FastReport脚

gitblog_00185的博客 329

Flink on k8s 环境搭建(一)

Flink on Yarn的环境搭建过程中,需要进行配置较多,且需要搭建zookeeper Hadoop Yarn 等相关组件,安装流程比较复杂,集群出现问题重新安装的流程也比较复杂,且Yarn的3个节点中 只能起了 3个resourceManager和1个NodeManager,Flink 作业申请资源时只能 向NodeManager的节点申请资源,整体有资源瓶颈的隐患(后继flink作业会越来越多),现在尝试进行Flink on k8s 的环境搭建。

wangqiaowq的博客 3413

RT-DETR改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度

本文记录的是利用改进检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch si

Limiiiing的博客 1646

基于C#的简单计算器

一、实验要求与学习目标1.1 实验要求参照Windows提供的计算器工具,设计一个与之类似的程序基本要求:实现“普通运算”功能,支持连续运算,如连续输入“2+3×5”后点击“等号”按钮进行运算其结果为25.附加要求支持“科学运算”功能,即输入表达式时遵循运算符号的优先原则,连续输入“2+3×5”后点击“等号”按钮进行运算其结果为17;支持数字键盘(小键盘)...

qq_38474871的博客 122

Unity最强动作战斗框架?Combat System Framework 深度解析

Combat System Framework 并不是一个简单的角色控制器,而是一套完整的动作游戏战斗开发框架。它借鉴了现代 AAA 游戏常见的架构思想,以 Gameplay Tag 为核心,结合 ScriptableObject 数据驱动设计,将技能、属性、Buff、伤害、武器、动画通知等系统有机整合在一起。同时,配套的可视化动画时间轴、Root Motion 工具和实时预览窗口,大幅优化了动作开发流程。当然,这套框架也有一定的学习门槛。

2403_88403568的博客 680

C# 篇基础知识5——委托和事件

事件处理程序是基于“委托”机制运行的。 1.委托 (1)委托的定义和使用 有时需要将一个函数作为另一个函数的参数,这时就要用到委托(Delegate)机制。例如设计一个马戏表演函数: //定义委托 delegate void AnimalPlay(string name); static void CircusStart(AnimalPlay animalPlay, string...

weixin_30256901的博客 180

Spring Boot入门(02):【教程】轻松搭建Spring Boot开发环境,启动你的第一个Web项目!

快速搭建开发环境和启动项目是每个开发人员必备的技能。本文将为您提供一些简单易懂的方法和技巧,以帮助您快速搭建开发环境和启动项目。我们将介绍如何选择适合您的开发工具、配置您的操作系统、安装必要的软件包和依赖项,并开始编写您的第一个应用程序。无论您是一位新手还是一位经验丰富的开发人员,本文都会给您提供有用的信息和实用的建议,让您在最短时间内快速搭建和启动开发项目。

**My Coding Family** 22万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

.NET事件的指导原则

C#允许编写所需的各种类型的事件。但是,为了与.NET Framwork的组件相兼容,开发人员必须遵循微软为此建立的一系列指导原则。这些指导原则的核心是,事件处理程序必须拥有两个参数。第一个参数是一个引用,它指向产生该事件的对象;第二个参数为EventArgs类型,它包含处理程序所需的其他信息。因此,与.NET兼容的处理程序通常采用下面的通用形式: void handl...

weixin_30698527的博客 75

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# 事件驱动编程的核心:深度解析发布者_订阅者模式

set;} // 传递计数状态// 发布者触发时传递参数。

钢铁男儿 495

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

WinCE5.0下实现透明背景按钮(.net C#)

标题: 【技术备档】在WinCE5.0下实现透明背景按钮(.net C#) - 源姜 2010-03-18 16:27 阅读:2183 - 评论:5 查看评论 发表评论 返回 问题:       需要在wince5.0下实现图形化界面,用于功能导航,用过GPS导航就知道了,类似的界面。众所周知gif,PNG等图片,都是可以实现透明背景的,在win下这应该不是个问题。但在ce5.0下

路漫漫 修远兮 4753

ASP.NET Core Minimal API 实战:用 HX-Trigger 响应头向浏览器发送多自定义事件与 JSON 载荷

`HX-Trigger` 是 htmx 提供的响应头,用于在 AJAX 请求完成后于浏览器端触发一个或多个自定义 DOM 事件。本文基于 [practical-aspnetcore](https://link.gitcode.com/i/d6ce7d4453bae3c3050732a98c240ba3) 仓库中的 [header-hx-trigger-4 示例](https://link.gitc

gitblog_00297的博客 367
上一篇: vs2008开发wap网站(一)
下一篇: ASP.NET关于Login控件使用
Devillyd
博客等级 码龄23年 58粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值