当前位置: 首页 > news >正文

C# 委托(为委托添加方法和从委托移除方法)

为委托添加方法

尽管通过上一节的内容我们知道了委托其实是不变的,不过C#提供了看上去可以为委托添
加方法的语法,即使用+:运算符。

例如,如下代码为委托的调用列表“添加”了两个方法。方法加在了调用列表的底部。
图14-7演示了结果。

MyDel delVar=inst.MyM1;  //创建并初始化
delVar +=SCl.m3;         //增加方法
delVar +=X.Act;          //增加方法

为委托添加方法的结果。由于委托是不可变的,所以为委托的调用列表添加3
个方法后的结果其实是变量指向的一个全新的委托

当然,在使用+=运算符时,实际发生的是创建了一个新的委托,其调用列表是左边的委托加
上右边方法的组合。然后将这个新的委托赋值给de1Var。

从委托移除方法

我们还可以使用-=运算符从委托移除方法。如下代码演示了-=运算符的使用。图14-8演示
了这段代码应用在图14-7演示的委托上的结果。

delVar-=SCl.m3;

从委托移除代码的结果

与为委托添加方法一样,其实是创建了一个新的委托新的委托是旧委托的副本一一只是没
有了已经被移除方法的引用。
如下是移除委托时需要记住的一些事项。

  • 如果在调用列表中的方法有多个实例,一:运算符将从列表最后开始搜索,并且移除第一
    个与方法匹配的实例。
  • 试图删除委托中不存在的方法将无效。
  • 试图调用空委托会抛出异常。可以通过将委托和null进行比较来判断委托的调用列表是
    否为空。如果调用列表为空,则委托是null。

调用委托

关于调用委托需要知道的重要事项如下。

  • 可以通过两种方式调用委托。一种是像调用方法一样调用委托,另一种是使用委托的
    lnvoke方法。
  • 如下面的代码块所示,可以将参数放在调用的圆括号内。用于调用委托的参数作用于调
    用列表中的每个方法(除非其中一个参数是输出参数,稍后将介绍)。
  • 如果一个方法在调用列表中多次出现,则在调用委托时,每次在列表中遇到该方法时都
    会调用它。
  • 调用时委托不能为空(null),否则将引发异常。可以使用if语句进行检查也可以使用
    空条件运算符和lnvoke方法。

下面的代码演示了创建和使用delVar委托的过程,该委托以单个整数作为输入值。使用参
数调用委托会导致它使用相同的参数值去调用其调用列表中的每一个成员。下面的代码演示了调
用委托的两种方法一一像方法一样调用和使用lnvoke调用。图14-9解释了这个调用过程。

Mydel delVar=inst.MyM1;
delVar+=SCl.m3;
delVar+=X.Act;...
if(delVar!=null)
{delVar(55);      //调用委托
}
delVar?Invoke(65);   //使用Invoke和空条件运算符

在调用委托时,它使用相同的参数来执行调用列表中的每一个方法

委托的示例

如下代码定义并使用了没有参数和返回值的委托。有关代码的注意事项如下。

  • Test类定义了两个打印函数。
  • Main方法创建了委托的实例并增加了另外3个方法。
  • 程序随后调用了委托,也就调用了它的方法。然而在调用委托之前,程序将进行检测以
    确保它不是null。
//定义一个没有返回值和参数的委托类型
delegate void PrintFunction();class Test
{public void Print1(){Console.WriteLine("Print1 -- instance");}public static void Print2{Console.WriteLine("Print2 -- static");}
}class Program
{static void Main(){Test t=new Test();    //创建一个测试类实例PrintFunction pf;     //创建一个空委托pf=t.Print1;          //实例化并初始化该委托//给委托增加3个另外的方法pf+=Test.Print2;pf+=t.Print1;pf+=Test.Print2;//现在,委托含有4个方法if(null!=pf)          //确认委托有方法pf();elseConsole.WriteLine("Delegate is empty");}
}

这段代码产生了如下的输出:

Print1 -- instance
Print2 -- static
Print1 -- instance
Print2 -- static
http://www.lqws.cn/news/556921.html

相关文章:

  • docker部署后端服务的脚本
  • Golang JSON 标准库用法详解
  • Foundry测试实战:解锁区块链测试新姿势
  • Java 大视界 -- Java 大数据机器学习模型在金融市场高频交易策略优化与风险控制中的应用(327)
  • 单调栈一文深度解析
  • NLP——文本预处理(下)
  • 翻译服务器
  • Redis高级数据结构深度解析:BitMap、布隆过滤器、HyperLogLog与Geo应用实践
  • 趣味数据结构之——数组
  • Java 使用 Easy Excel 进行 Excel 数据导入导出
  • 一分钟了解思路链提示词(Chain-of-thought Prompting)
  • uni-app manifest.json 配置:定制化应用的各项功能和行为
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(二)- 职位数据清洗与预处理
  • 《自动控制原理 》- 第 1 章 自动控制的基本原理与方式
  • Linux基本指令篇 —— more指令
  • PostgreSQL 中,若需显示 不在 `IN` 子句列表中的数据
  • SQL常用命令
  • 阿里云Ubuntu服务器上安装MySQL并配置远程连接
  • 网络缓冲区
  • Solidity学习 - 错误处理
  • ffpaly播放 g711a音频命令
  • 【学习笔记】深入理解Java虚拟机学习笔记——第12章 Java内存模型与线程
  • 设计模式之抽象工厂模式
  • Docker 入门教程(五):Docker 命令思维导图
  • 【分布式机架感知】分布式机架感知能力的主流存储系统与数据库软件
  • 微处理原理与应用篇---STM32寄存器控制GPIO
  • 矩阵的条件数(Condition Number of a Matrix)
  • 华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio安装NoteGen AI笔记应用程序
  • Learning PostgresSQL读书笔记: 第11章 Transactions, MVCC, WALs, and Checkpoints
  • 基于Docker的mosquitto安装测试