0

0

解释C#中委托的概念

PHPz

PHPz

发布时间:2023-08-31 21:17:02

|

1290人浏览过

|

来源于tutorialspoint

转载

解释c#中委托的概念

如果您是 C 程序员,则可以将委托视为指向函数的指针。然而,C# 中的委托不仅仅是一个简单的函数指针。本文解释了委托的概念及其在日常编程中的用途。

本质上,委托提供了一定程度的间接性。它们封装了一段可以以类型安全的方式传递和执行的代码。它不是立即执行该行为,而是包含在一个对象中。您可以对该对象执行多种操作,其中之一是执行包含的行为。

使用委托允许我们编写高阶函数,即可以接收函数作为参数或返回的函数作为返回值的函数。委托类型定义委托可以表示的方法签名,特别是方法的返回类型及其参数类型。在下面的示例中,Transformer 是一个委托,可以表示任何接受并返回整数的方法。

delegate int Transformer(int x);

我们可以将任何方法(包括 lambda、实例或静态方法)分配给满足签名的 Transformer 实例。例如 -

Transformer square = x => x * x;
Transformer cube = x => x * x * x;

Console.WriteLine(square(3)); // prints 9
Console.WriteLine(cube(5)); // prints 125

何时使用委托?

当想要执行某些操作的代码不知道这些操作的详细信息但知道这些操作的接口时,通常会使用委托。 p>

在编程中,我们经常遇到需要执行特定操作的情况,但我们事先不知道要调用哪个方法来执行它。委托帮助我们解决这个问题,方法是用委托替换该行为,然后根据上下文和情况的需要传递具有适当行为的委托的具体实例。

为了让委托做任何事情,需要发生四件事 -

1) 需要声明委托类型。

委托类型本质上是它所代表的函数的定义,即它由参数组成函数将接受的类型及其返回的返回类型。

例如,代表接受两个数字作为输入并返回数字的方法的委托类型可以声明为 -

delegate int Processor(int numOne, int numTwo);

处理器是一种类型,类似于由类创建的类型。要创建此类型的实例,您需要一个接受两个数字作为输入并返回布尔值的方法。

2) 要执行的代码必须包含在方法中。

定义一个与上述委托类型具有完全相同签名的方法,并且根据运行时的情况执行您想要的操作。例如,以下任何方法都可用于创建 Processor 实例,因为它们都采用两个数字并返回一个数字。

static int Add(int numOne, int numTwo){
   Return numOne + numTwo;
}
static int Subtract(int numOne, int numTwo){
   Return numOne - numTwo;
}

3) 必须创建委托实例。

现在您已经有了委托类型和具有正确签名的方法,您可以创建该委托类型的实例。这样做时,我们实质上是告诉 C# 编译器在调用委托实例时执行此方法。

Processor processorOne = new Processor(Add);
Processor processorTwo = new Processor(Subtract);

上面的示例假设 Add 和 Subtract 方法是在我们创建委托实例的同一类中定义的。如果这些方法是在不同的类中定义的,我们将需要该类的实例。

Live PPT
Live PPT

一款AI智能化生成演示内容的在线工具。只需输入一句话、粘贴一段内容、或者导入文件,AI生成高质量PPT。

下载

4) 必须调用委托实例。

这只是调用一个委托实例上的方法,毫不奇怪地命名为 Invoke。委托实例上的此方法具有与委托类型声明指定的相同参数列表和返回类型。调用 Invoke 将执行委托实例的操作。

int sum = processorOne.Invoke(3, 5);

但是,C# 使它变得更加容易。您可以直接调用委托实例,就像它本身就是一个方法一样。例如,

int difference = processorTwo(10, 6);

组合和删除委托

如果我们想通过一次委托实例调用来执行一系列不同的操作,C# 允许我们这样做。系统。委托类型有两个静态方法,称为Combine 和Remove。

1.组合

创建一个带有调用列表的新委托,该调用列表连接作为参数传递的委托的调用列表。当调用新的委托实例时,它的所有操作都会按顺序执行。

public static Delegate Combine(params Delegate[] delegates); // OR
public static Delegate Combine(Delegate a, Delegate b);

如果调用列表中的任何操作抛出异常,则会阻止执行任何后续操作。

2.删除

从另一个委托的调用列表中删除最后一次出现的委托调用列表。返回一个新委托,其中包含通过获取源调用列表并删除最后一次出现的值调用列表而形成的调用列表。

public static Delegate Remove(Delegate source, Delegate value);

摘要

  • 委托使用特定类型和参数集封装行为,类似于单方法接口。

  • 委托类型声明所描述的类型签名决定了哪些方法可用于创建委托实例以及调用的签名。

  • 创建委托实例需要我们希望在调用委托时执行的方法。

  • 委托实例是不可变的,类似于字符串。

  • 每个委托实例都包含一个调用列表 - 操作列表。

  • 委托实例可以相互组合和删除。

  • ul>

    示例

     实时演示

    using System;
    class Program{
       delegate int Transformer(int x);
       delegate int Processor(int numOne, int numTwo);
       static void Main(){
          Transformer square = x => x * x;
          Transformer cube = x => x * x * x;
          Console.WriteLine(square(3)); // prints 9
          Console.WriteLine(cube(5)); // prints 125
          Processor processorOne = new Processor(Add);
          Processor processorTwo = new Processor(Subtract);
          int sum = processorOne.Invoke(3, 5);
          Console.WriteLine(sum); // prints 8
          int difference = processorTwo(10, 6);
          Console.WriteLine(difference); // prints 4
       }
       static int Add(int numOne, int numTwo){
          return numOne + numTwo;
       }
       static int Subtract(int numOne, int numTwo){
          return numOne - numTwo;
       }
    }

    输出

    9
    125
    8
    4

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

619

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

550

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

545

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

161

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

81

2025.08.07

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号