返回

漫谈委托及其关联的delegate、Action、Func、Predicate

前端

C#基础知识学习之 ✨ 委托的兄弟姐妹们 delegate、Action、Func、Predicate

本系列文章按照预定方向逐步展开,而非直接阐述观点,不过观点始终隐没于字里行间,等待您的深度挖掘。系列文章结构清晰,逻辑连贯,独具一格,上下文紧密关联。

前面几篇文章已经详细介绍了委托和Action、Func、Predicate这几位知己。文章八月末更文的最后,会着重突出他们的老红颜知己Event,借此强调它们的相互关系。作为一项强有力的工具,委托在使用时,把握以下几点即可:

  1. 确定委托的类型和参数。
  2. 定义委托的变量。
  3. 将委托指向方法。
  4. 调用委托。

阐释C#委托及其家庭成员delegate、Action、Func和Predicate

委托delegate

委托是在C#中实现函数式编程的关键,是代码中两种委托方法(或方法组)之间的一种连接。用它可以方便地将方法作为参数进行传递。

它就像是一个指向函数的指针,允许您以变量的形式传递函数,就像传递其他变量一样。这有助于代码重用和代码简洁,特别是处理事件或回调时。

一个简单的委托delegate示例如下所示:

// 定义委托类型
public delegate void GreetingDelegate(string name);

// 实现委托
public static void Greet(string name)
{
    Console.WriteLine(
// 定义委托类型
public delegate void GreetingDelegate(string name);

// 实现委托
public static void Greet(string name)
{
    Console.WriteLine($"Hello, {name}!");
}

// 使用委托
GreetingDelegate greetDelegate = new GreetingDelegate(Greet);

// 调用委托
greetDelegate("John"); // 输出: "Hello, John!"
quot;Hello, {name}!"
); } // 使用委托 GreetingDelegate greetDelegate = new GreetingDelegate(Greet); // 调用委托 greetDelegate("John"); // 输出: "Hello, John!"

delegate的兄弟Action

Action和Action是委托的两个特殊形式。Action是无返回值的委托类型,而Action是带有单个参数且无返回值的委托类型。

下面是一个使用Action的示例:

// 定义Action委托类型
Action greetAction = () => Console.WriteLine("Hello, world!");

// 调用Action委托
greetAction(); // 输出: "Hello, world!"

delegate的兄弟姐妹Func

Func和Func<T, TResult>是委托的两个特殊形式。Func是带返回值的委托类型,而Func<T, TResult>是带有单个参数和返回值的委托类型。

下面是一个使用Func的示例:

// 定义Func委托类型
Func<int, int> squareFunction = x => x * x;

// 调用Func委托
int result = squareFunction(5); // result 为 25

delegate的弟弟Predicate

Predicate和Predicate是委托的两个特殊形式。Predicate是返回布尔值的委托类型,而Predicate是带有单个参数并返回布尔值的委托类型。

下面是一个使用Predicate的示例:

// 定义Predicate委托类型
Predicate<int> isEvenPredicate = x => x % 2 == 0;

// 调用Predicate委托
bool isEven = isEvenPredicate(10); // isEven 为 true

本系列文章结尾之际,希望大家对委托及其朋友们Action、Func、Predicate之间互相的关系有更加透彻的了解。之后很快会介绍另一个知己Event。

精彩专栏—别样的委托用法

作为一个语言功能强大的编程语言,C#语言拥有许多元素和用法。有些元素经常出现在各种库和开源项目中。它们是委托及其兄弟Action、Func、Predicate、Event的知识延伸,可使您的编码能力更上一层楼。

对于委托的兄弟姊妹们,本文已经给出了它们各自的基本示例。不过需要注意,由于这几种委托类型都是无状态的,因此不能存储有关委托创建时环境的信息。如果您需要存储状态信息,则可以使用匿名方法或lambda表达式。

此外,委托类型是协变的。这意味着您可以将派生类型的委托赋值给基类型的委托变量。例如,您可以将Func<Derived, int>委托赋值给Func<Base, int>委托变量。

在文章结尾处特别提及一下委托类型是密封的。这意味着您不能创建委托类型的派生类型。因此,您不能扩展委托类型以添加新方法或属性。

使用这些内容可以将自己有关C#委托、Action、Func和Predicate的知识进行升华,之后添加一个众所周知的密切相关的老友Event,他们将会一直伴随您左右。通过熟练使用它们,您的代码将变得更加优美和简洁。

最后,本系列文章即将结束,希望您对C#委托及其family member有一定的了解。您可以在项目中尝试使用它们,看它们如何帮助您编写更干净、更可维护的代码。

感谢您的阅读!