解释C#中委托的概念

解释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 9Console.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 方法是在我们创建委托实例的同一类中定义的。如果这些方法是在不同的类中定义的,我们将需要该类的实例。

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); // ORpublic 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;   }}

输出

912584

以上就是解释C#中委托的概念的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1435112.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 10:42:34
下一篇 2025年12月8日 17:50:28

相关推荐

  • C#中如何使用order by、group by?

    Order by is used to sort the arrays in the ascending or in the descending order GroupBy operator belong to Grouping Operators category. This operator …

    2025年12月17日
    000
  • 如何在 C# 中创建 HashTable 集合?

    HashTable是 C# 中的非泛型集合。它存储键值对,类似于通用的“字典”集合。 HashTable 定义在 System. Collections. namespace. HashTable计算每个键的哈希码并将其存储在内部不同的桶中。然后,当访问值时,哈希码将与指定键的哈希码进行匹配。因此,…

    2025年12月17日
    000
  • C# 中关键字 const 和 readonly 有什么区别?

    常量 常量字段是不能修改的字段。声明的时候需要给它赋值。 const int a = 5; Readonly ​​> 只读字段在声明时初始化,或者您也可以在构造函数中设置它。 让我们看一个示例,其中只读字段只有字段在构造函数内初始化 – 示例 class Calculate { r…

    2025年12月17日
    000
  • C# 中的 System.ArrayCopyTo() 与 System.ArrayClone()

    ArrayCopyTo() 方法将当前一维数组的所有元素复制到指定的一维数组中,从指定的目标数组索引开始。索引被指定为一个32位整数。 在C#中,CopyTo() 方法用于将一个数组的元素复制到另一个数组中。在这个方法中,你可以设置从源数组中复制的起始索引。 以下是一个示例,展示了在C#中使用数组类…

    2025年12月17日
    000
  • 如何将 JavaScript 数组转换为 C# 数组?

    假设我们的 JavaScript 数组是 – var myArr = new Array(5); myArr[0] = “Welcome”; myArr[1] = “to”; myArr[2] = “the”; myArr[3] = “Web”; myArr[4] = “World”; …

    2025年12月17日
    000
  • 在 C# 中使用 GZIP 格式压缩和解压缩文件

    要使用 GZIP 格式压缩和解压缩文件,请使用 GZipStream 类。 压缩 要压缩文件,请使用 GZipStream 类和 FileStream 类。设置以下参数。 要压缩的文件以及输出zip文件的名称。 这里,outputFile是输出文件,该文件被读入FileStream。 p> 示…

    2025年12月17日
    000
  • C#4.0 中的元组是什么?

    Tuples具有不同数据类型的元素序列。它被引入以返回一个Tuple的实例,无需单独指定每个元素的类型。 让我们创建一个包含两个元素的元组。以下是声明元组的方法。 − Tupleperson = new Tuple (32, “Steve”); 现在,例如检查元组中的第一项,它是一个整数 &#821…

    2025年12月17日
    000
  • 如何在 C# 中将列表转换为字符串?

    声明一个列表。 List l = new List (); 现在,将元素添加到列表中。 // elementsl.Add(“Accessories”);l.Add(“Footwear”);l.Add(“Watches”); 现在将其转换为字符串。 string str = string.Join(“…

    2025年12月17日
    000
  • C# 代码的优化技巧

    以下是一些建议 − 首选列表 在必要时使用列表。使用ArrayList进行相同的工作可能会使代码的工作速度变慢。特别是当您在同一个列表中存储多种类型的对象时。 使用乘法移位操作 与除法运算符相比,最好使用乘法移位操作,因为使用除法运算符会使代码变慢。 代码越少,占用的内存越少 尝试使用运算符来简洁代…

    2025年12月17日
    000
  • 如何捕获 C# 中 async void 方法抛出的异常?

    在同步 C# 代码中,异常在调用堆栈中向上传播,直到到达可以处理异常的适当 catch 块。但是,异步方法中的异常处理并不那么简单。 C# 中的异步方法可以具有三种类型的返回值:void、Task 和 Task。当返回类型为 Task 或 Task 的异步方法中发生异常时,异常对象将包装在 Aggr…

    2025年12月17日
    000
  • C# 中的抽象关键字

    C#中的abstract关键字用于抽象类。 C# 中的抽象类包括抽象方法和非抽象方法。您无法实例化抽象类。 抽象类 Vehicle 和抽象方法 display() 的示例 – public abstract class Vehicle { public abstract void dis…

    2025年12月17日
    000
  • C#显示线程优先级的程序

    要在 C# 中显示线程的优先级,请使用 Priority 属性。 首先,使用 currentThread 属性显示有关线程的信息 – Thread thread = Thread.CurrentThread; 现在使用 thread.Priority 属性来显示线程的优先级 &#8211…

    2025年12月17日
    000
  • C# 中交错数组的元素类型是什么?

    交错数组是数组的数组,因此它的元素是引用类型并初始化为 null。 让我们看看如何使用交错数组 – 声明锯齿状数组 – int [][] marks; 现在,让我们初始化它,其中marks是一个由5个整数组成的数组 – int[][] marks = new in…

    2025年12月17日
    000
  • 如何在 C# 中使用 Newtonsoft json 将 JSON 反序列化为 .NET 对象并从数组中仅选择一个值?

    WebClient 类提供了向由 URI 标识的任何本地、Intranet 或 Internet 资源发送数据或从其接收数据的常用方法。 WebClient 类使用 WebRequest 类提供对资源的访问。 WebClient 实例可以使用通过 WebRequest.RegisterPrefix …

    2025年12月17日
    000
  • 如何在 LINQ C# 中同时使用 Take 和 Skip 运算符?

    Take 运算符用于从数组中返回给定数量的元素,并且数组 Take,从 a 中的第一个元素开始将元素提取到指定位置sequence. Example 1 的翻译为:sequence. 示例1 class Program{ static void Main(string[] args){ List n…

    2025年12月17日
    000
  • 如何在 C# 中访问矩形数组中的元素?

    要从矩形数组中访问元素,您只需要设置要获取元素的索引。多维数组也称为矩形数组 − a[0,1]; // second element 下面是一个示例,展示了如何在C#中使用矩形数组并访问一个元素 − 示例 using System;namespace Demo { class Program { s…

    2025年12月17日
    000
  • C# 中字典和数组有什么区别?

    字典 字典是C#中的键值对集合。字典包含在System.Collection.Generics命名空间中。 声明一个字典的方法如下: IDictionary d = new Dictionary(); 要添加元素 − IDictionary d = new Dictionary();d.Add(1,…

    2025年12月17日
    000
  • 在 C# 中使用哈希表和字典

    Hashtable Hashtable class represents a collection of key-and-value pairs that are organized based on the hash code of the key. It uses the key to acce…

    2025年12月17日
    000
  • C# 中的finally 语句是什么?

    final 块用于执行一组给定的语句,无论是否抛出异常。例如,如果打开一个文件,无论是否引发异常,都必须关闭该文件。 错误处理块是使用 try、catch 和 finally 关键字实现的。 示例 您可以尝试运行以下代码来实现finally语句 – using System;namesp…

    2025年12月17日
    000
  • 在 Linux 中执行 C# 代码

    到目前为止,以 .net 为中心的应用程序都是针对 windows 操作系统的,但现在 microsoft 推出了一种名为 mono 的新跨平台应用程序,它可以执行在 .net 下开发的应用程序 Mono Mono 是一个开源实用程序,它允许开发人员在 Mac 或 Linux 等其他平台上执行以 .…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信