事件与委托详解

Qml 语法规范等相关笔记 /* Item 为什么能包含Item 因为item都有一个parent这个属性,它的基类都是Object 或者是Item,所以就能够这样包含了, 包含了的意思就是就是他们为父子关系,相当于c++ 里面的构造函数里面的指定了parent,因为parent的基类参数是 一致的,符合的,都是基于Object,或者Item,所以可以包含进来 这样就设置为了父子关系了 */ Item { Item { } } /* 官方文档指定了headerDelegate:Component 为什么设置为head... 阅读详情
Delegate
delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。
实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate:
1.声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
2. 创建delegate对象,并将你想要传递的函数作为参数传入。
3. 在要实现异步调用的地方,通过上一步创建的对象来调用方法。using System;

public class MyDelegateTest
{
        // 步骤1,声明delegate对象
        public delegate void MyDelegate(string name);

        // 这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型
        public static void MyDelegateFunc(string name)
        {
                  Console.WriteLine("Hello, ", name);
        }
        public static void Main()
        {
                  // 步骤2,创建delegate对象
 MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc);
                 // 步骤3,调用delegate
                 md("sam1111");
        }
}

输出结果是:Hello, sam1111

了解了delegate,下面我们来看看,在C#中对事件是如何处理的。

C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子:

public delegate void MyEventHandler(object sender, MyEventArgs e);

其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。

就是这么简单,结合delegate的实现,我们可以将自定义事件的实现归结为以下几步:

1.定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。
2.定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
3.定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。
4. 用event关键字定义事件对象,它同时也是一个delegate对象。
5.用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。
6.在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。
7. 在适当的地方调用事件触发方法触发事件。

下面是一个简单的例子:

using System;
public class EventTest
{
        // 步骤1,定义delegate对象
       public delegate void MyEventHandler(object sender, System.EventArgs e);
       // 步骤2省略
       public class MyEventCls
       {
                // 步骤3,定义事件处理方法,它与delegate对象具有相同的参数和返回值类// 型
                public  void MyEventFunc(object sender, System.EventArgs e)
                {
                           Console.WriteLine("My event is ok!");
                }
       }
       // 步骤4,用event关键字定义事件对象
      private event MyEventHandler myevent;
      private MyEventCls myecls;
      public EventTest()
      {
                myecls = new MyEventCls();
          :      // 步骤5,用+=操作符将事件添加到队列中
                this.myevent += new MyEventHandler(myecls.MyEventFunc);
      }
      // 步骤6,以调用delegate的方式写事件触发函数
     protected void OnMyEvent(System.EventArgs e)
      {
               if(myevent != null)
                       myevent(this, e);
      }
     public void RaiseEvent()
      {
               EventArgs e = new EventArgs();
      :         // 步骤7,触发事件
               OnMyEvent(e);
      }
      public static void Main()
      {
               EventTest et = new EventTest();
               Console.Write("Please input ''a'':");
               string s = Console.ReadLine();
               if(s == "a")
               {
                     et.RaiseEvent();
               }
               else
              {
                        Console.WriteLine("Error");
              }
      }
}

输出结果如下,红色为用户的输入:

Please input ‘a’: a
My event is ok!

 
上位机C#中委托(delegate)与事件(event)的快速理解 具有返回值的委托类型,返回值默认是最后一个函数的返回值,就是最后添加的返回值。 阅读详情

相关推荐

C#中的委托与事件详解

委托(Delegate)是C#中的一种类型,用于引用具有特定参数列表和返回类型的方法,本质上是一种类型安全的函数指针。它允许将方法作为参数传递、存储在变量中或从方法返回。委托支持多播,可以组合多个方法,并且是.NET事件模型的基础。C#中常用的内置委托类型包括Action、Func和Predicate,分别用于无返回值、有返回值和返回布尔值的方法。 事件(Event)是建立在委托基础上的高级特性,用于实现观察者模式(发布-订阅模型)。事件封装了委托,限制外部只能通过+=和-=操作订阅或取消订阅,提供了更安全

记录学习的过程 1304

QML 设置Rectangle部分边框颜色和宽度

设置Rectangle组件部分边框颜色和宽度

weixin_43400299的博客 3103

45、C 委托与事件详解

本文详细介绍了 C# 中委托与事件的核心概念及使用方法。内容涵盖委托的基础操作、多播委托的实现、泛型委托与内置 Action 和 Func 委托的使用,以及事件的关键字定义与底层原理。同时,文章通过流程图对比了事件处理的流程,并讨论了委托与事件在实际应用中的注意事项和未来发展趋势。通过示例代码,帮助开发者更好地理解对象间通信机制,提高代码的安全性和可维护性。

www00的博客 59

qt listview中delegate 布局_Qt十万级树结构

简介最近遇到一些需求,要在Qt/Qml中开发树结构,并能够导入、导出json格式。于是我写了一个简易的Demo,并做了一些性能测试。在这里将源码、实现原理、以及性能测试都记录、分享出来,算是抛砖引玉吧,希望有更多人来讨论、交流。源码先放源码githubhttps://github.com/jaredtao/TreeEditgiteehttps://gitee.com/jaredt...

weixin_35813719的博客 993

lammps建模(电解液)opls-aa力场的基本流程

lammps建模(电解液)opls-aa力场的基本流程

syj0922的博客 2133

01 高等数学 上下册知识点总结

极限与连续 8个等价无穷小 8个常用泰勒公式 高数复习——多元函数微分学 一、概念 一元函数: 可微<=>可导 △y=A△x+o(△x)dy=AdxA=f′(x)\triangle y=A\triangle x+o(\triangle x)\\dy=Adx\\A=f'(x)△y=A△x+o(△x)dy=AdxA=f′(x) 多元函数: 可微=>可导(可导指两个偏导数存在,反之不成立) 可微=>连续(反之不成立) △z=A△x+B△y+o(p)dz=Adx+BdyA=δzδxdx

qq_44292038的博客 1万+

QML类型:TableView、PathView、ObjectModel

ObjectModel 包含要在视图中使用的可视项。在视图中使用 ObjectModel 时,视图不需要委托,因为 ObjectModel 已经包含可视委托(项目)。只读属性,模型中的项目数。此附加属性保存模型中此委托项的索引。它附加到委托的每个实例。返回模型中索引处的项目。其他成员函数见:ListModel 的成员函数。

hw5230的博客 1082

软件工程导论考试通关秘籍:太原理工大学历年真题解析(附答案)

本文为太原理工大学《软件工程导论》考试提供高效备考指南,通过解析近六年真题,揭示高频考点如软件生命周期、UML建模和结构化设计等核心模块的命题规律。文章提供真题拆解、实战策略和避坑指南,帮助考生掌握图形转换题和简答题的应答技巧,助力考试通关。

weixin_29233333的博客 227

c# 中的事件与委托详解

在浏览之余发现了这篇好文章,转载于此,原文链接: https://www.cnblogs.com/newcapecjmc/p/7084026.html C#中委托和事件 关于委托和事件分享三个博客内容: 首先说明下: (1)C#中事件:事件时属于类的成员,所以要放在类的内部。 (2)委托属于一个定义,是和类、接口类似的,通常放在外部。 (因为大多数委托都要被重用) 委托定义在类里面还是类外面视情况而定,一般定义在与类定义平级部分, 且用public修饰,便于外部调用。 若定义在类的内部

qq_39024280的博客 6244

ubuntu22.04 安装部署 openclaw

ubuntu22.04 安装部署 openclaw

nalanxiaoxiao2011的博客 986

锐捷路由器DNS Proxy保姆级配置教程:从零到实战,手把手教你搞定内网域名解析

本文提供锐捷路由器DNS Proxy功能的详细配置教程,从基础环境搭建到实战测试,手把手教你实现内网域名解析。涵盖上游DNS设置、内网域名映射、故障排查等关键步骤,帮助网络管理员快速解决内网访问难题,提升工作效率。

weixin_29284657的博客 555

C# 中的委托与事件详解

定义委托类型创建委托实例并绑定方法调用委托执行方法委托是方法的引用,提供了灵活的回调机制。事件是对委托的封装,主要用于发布-订阅模式,保证封装性和安全性。熟练掌握委托和事件,可以让你的 C# 程序更具扩展性和可维护性。

qq_55105804的博客 775

UNet改进(54):当医学图像分割遇上频域学习与自监督

本文提出了一种改进U-Net的方法,通过频域增强模块和代理任务模块提升医学图像分割性能。频域增强模块在傅里叶空间对特征图进行可学习的频率调制,重点增强高频细节特征;代理任务模块通过图像重建约束编码器保留关键信息。两个模块协同工作,在仅增加5%参数量的情况下,形成空间域、频域和重建约束三条互补的信息路径。该方法特别适用于需要精细边缘分割的医学图像任务,预期能提升5%-10%的边缘分割精度,在小样本场景效果更显著。部署时可移除代理任务模块,不影响推理效率。未来可探索空间自适应频域调制和更丰富的代理任务设计。

2501_91516851的博客 226

详解C#委托与事件

定义委托需要指定它所代表的方法的原型,包括返回类型和参数列表。这定义了一个名为MyDelegate的委托,它代表一个接受两个整数参数并返回一个整数的方法。事件基于委托类型定义,通常使用或自定义的委托类型。定义事件时,通常在类中声明一个委托类型的私有字段,并在此基础上声明一个公共的事件属性。// 自定义委托类型// 定义事件// 使用事件属性暴露事件// 触发事件= null)在这个例子中,Publisher类有一个名为MyEvent的事件,它基于委托类型。事件触发时,RaiseEvent。

Oona_01的博客 820

《Python全栈系列教程》专栏介绍及文章汇总

《Python全栈系列教程》专栏介绍及文章汇总

孤寒者的博客 71万+

【Jenkins】Jenkins :首次登录直接使用 admin 账户

目录 一、使用admin账户 二、修改admin用户密码 三、管理视图 一、使用admin账户 安装时,自定义安装,选择必要的插件安装,设置Jenkins的URL为: http://本机或服务器IP:8080 然后在创建第一个管理者界面,直接选择:使用admin 二、修改admin用户密码 进入:系统管理——管理用户——选中用户——点击设置图标——修改密码: 三、...

顾三殇 —— 博客空间(软件测试) 1万+

C# 之委托与事件详解

C#委托与事件核心机制解析 摘要:本文深入探讨C#中委托与事件的核心机制。委托作为类型安全的函数指针,支持多播和泛型应用(如Func/Action)。事件基于委托实现发布-订阅模型,采用标准模式定义和触发。文章详解了协变/逆变、异步调用、弱事件等高级特性,并展示了在LINQ和设计模式(如观察者模式)中的实际应用。通过自定义事件访问器和WeakEventManager等技术,开发者可以构建松耦合、高效且内存安全的响应式系统。这些机制共同构成了C#事件驱动编程的基础,为复杂应用程序提供了灵活的架构方案。

weixin_45590420的博客 1920

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

委托与事件-事件详解(二)

前言   上一节我们了解学习了委托,委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含对方法的引用,也可以包含对多个方法的引用。   理解委托的一种好的方式是把委托视为是给方法的签名和返回类型指定名称。   今天我们继续来了解委托和事件,现在我们来了解学习一下事件详解。 事件   事件基于委托,为委托提供了一种发布/订阅机制,在.Net中随处可见到这种事件,例如在...

dingxian9983的博客 181

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C#委托与事件详解

本文转载自http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html C# 中的委托和事件(详解) C# 中的委托和事件        委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有...

快乐小羊~ 227

C#事件与委托(详解)

C#事件与委托详解【精华 多看看】Delegatedelegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用"。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,...

yangjiangyy的博客 1689

JavaScript事件机制详解:捕获、冒泡与事件委托

本章讲述了什么是事件机制,如何利用好JavaScript中的事件机制

2403_86719076的博客 1628

C#事件与委托详解【精华 多看看】

Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用"。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数委托和

jamestaosh 7万+

C# 事件与委托详解

看了一个博主写的 好详细啊 通俗易懂 https://blog.youkuaiyun.com/lizhenxiqnmlgb/article/details/82141968

qq_41918045的博客 142

Python.NET事件与委托详解:让Python函数接管C回调与事件订阅

**Python.NET** 是连接 Python 与 .NET 运行时的桥梁。本指南聚焦它最实用的两大特性:**委托(Delegate)** 与 **事件(Event)**——让普通的 Python 函数直接接管 C# 的回调与事件订阅,用一行 `+=` 就能把事件处理逻辑交给 Python,几乎零样板代码。 ## 一、委托与事件:30 秒理解核心概念 如果你熟悉 Python 的函数式风格

gitblog_01161的博客 805

委托与事件代码详解

委托与事件代码详解using System;using System.Collections.Generic;using System.Text;namespace @Delegate //自定义命名空间,新建控制台程序,命名后自动添加{    // 热水器    public class Heater    {        private int temperature;       

fangyuan303687320的专栏 1705
上一篇: 避免表格被撑开变形
下一篇: C#基础概念二十五问
codeofsea
博客等级 码龄20年 3粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值