当前位置: 首页 > 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.lryc.cn/news/576689.html

相关文章:

  • 13-StringBuilder类的使用
  • Linux内核网络协议栈深度解析:面向连接的INET套接字实现
  • 8. 【Vue实战--孢子记账--Web 版开发】-- 账户账本管理
  • Uni-App 小程序面试题高频问答汇总
  • 【Docker基础】Docker容器管理:docker top及其参数详解
  • Ubuntu 主机通过 `enp4s0` 向开发板共享网络的完整步骤
  • Flutter基础(控制器)
  • 广外计算机网络期末复习
  • 大模型之提示词工程入门——解锁与AI高效沟通的“钥匙”
  • WOE值:风险建模中的“证据权重”量化术——从似然比理论到FICO评分卡实践
  • python学习打卡day57
  • Python基础(吃洋葱小游戏)
  • 如何让ChatGPT模仿人类写作,降低AIGC率?
  • SpringBoot3.x整合Knife4j接口文档
  • cocos creator 3.8 - 精品源码 - 六边形消消乐(六边形叠叠乐、六边形堆叠战士)
  • 阿里 Qwen3 模型更新,吉卜力风格get
  • (五)神经网络
  • 【数据标注师】线标注
  • Linux软连接和硬连接
  • 复杂驱动开发-TLE9471的休眠流程与定时唤醒
  • 断路器、空气开关、漏电保护器
  • 【扩欧应用】同余方程
  • 概述-4-通用语法及分类
  • 领域驱动设计(DDD)【21】之值对象的优势
  • WebRTC(十二):DTLS
  • PowerBI 柱状图显示MoM销量环比示例,以及解决相同列值时设置柱子颜色的问题
  • 【转】PostgreSql的镜像地址
  • 一个简单测试Deepseek吞吐量的脚本,国内环境可跑
  • QTreeWidget 简单使用
  • web自动化测试常见函数