漫谈委托及其关联的delegate、Action、Func、Predicate
2023-09-13 15:05:40
C#基础知识学习之 ✨ 委托的兄弟姐妹们 delegate、Action、Func、Predicate
本系列文章按照预定方向逐步展开,而非直接阐述观点,不过观点始终隐没于字里行间,等待您的深度挖掘。系列文章结构清晰,逻辑连贯,独具一格,上下文紧密关联。
前面几篇文章已经详细介绍了委托和Action、Func、Predicate这几位知己。文章八月末更文的最后,会着重突出他们的老红颜知己Event,借此强调它们的相互关系。作为一项强有力的工具,委托在使用时,把握以下几点即可:
- 确定委托的类型和参数。
- 定义委托的变量。
- 将委托指向方法。
- 调用委托。
阐释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 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<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有一定的了解。您可以在项目中尝试使用它们,看它们如何帮助您编写更干净、更可维护的代码。
感谢您的阅读!