介绍
在 C# 中,委托是一种强大的工具,它使方法能够作为参数传递。最常用的两种委托类型是 Action 和 Func。这些通用委托通过为常见场景提供内置类型来简化委托的使用。本文探讨 Action 和 Func 委托、它们的区别以及如何有效使用它们的实际示例。
Action委托
Action 委托表示执行操作但不返回值的方法。它可以采用零个或多个参数。
句法
public delegate void Action();
public delegate void Action<T>(T arg);
public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
// 最多16个参数
例子
using System;
public class ActionExample
{public static void PrintMessage(){Console.WriteLine("Hello, World!");}public static void PrintNumber(int number){Console.WriteLine($"Number: {number}");}public static void Main(){Action action = PrintMessage;action();Action<int> actionWithParam = PrintNumber;actionWithParam(42);}
}
在这个例子中,PrintMessage 和 PrintNumber 是与 Action 委托签名相匹配的方法。Action 委托封装了这些方法并允许通过委托实例调用它们。
Func委托
Func委托用于表示返回值的方法。它可以采用零个或多个参数,但必须返回一个值。
句法
public delegate TResult Func<TResult>();
public delegate TResult Func<T, TResult>(T arg);
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
// 最多16个参数
例子
using System;
public class FuncExample
{public static int GetNumber(){return 42;}public static string ConcatenateStrings(string str1, string str2){return str1 + str2;}public static void Main(){Func<int> func = GetNumber;int result = func();Console.WriteLine($"Result: {result}");Func<string, string, string> funcWithParams = ConcatenateStrings;string concatenated = funcWithParams("Hello, ", "World!");Console.WriteLine($"Concatenated: {concatenated}");}
}
在此示例中,GetNumber 和 ConcatenateStrings 是与 Func 委托签名匹配的方法。Func 委托封装了这些方法并允许通过委托实例调用它们。
Action 和 Func 之间的区别
Action 和 Func 委托之间的主要区别在于它们的返回类型。
- Action:表示没有返回值(void)的方法。
- Func:表示返回值的方法。
实际用途
委托(包括 Action 和 Func)通常用于事件处理、回调方法以及作为对集合执行操作的方法的参数。
示例。在列表操作中使用 Action 和 Func。
using System;
using System.Collections.Generic;
public class ListOperationExample
{public static void PerformActionOnList<T>(List<T> list, Action<T> action){foreach (var item in list){action(item);}}public static List<TResult> TransformList<T, TResult>(List<T> list, Func<T, TResult> func){var resultList = new List<TResult>();foreach (var item in list){resultList.Add(func(item));}return resultList;}public static void Main(){var numbers = new List<int> { 1, 2, 3, 4, 5 };PerformActionOnList(numbers, n => Console.WriteLine($"Number: {n}"));var doubledNumbers = TransformList(numbers, n => n * 2);PerformActionOnList(doubledNumbers, n => Console.WriteLine($"Doubled Number: {n}"));}
}
在此示例中,PerformActionOnList 采用 Action 对列表中的每个项目进行操作,而 TransformList 采用 Func<T, TResult> 来转换列表中的每个项目并返回一个新列表。
结论
Action 和 Func 委托是 C# 中必不可少的工具,它们允许将方法作为参数传递,从而实现更灵活、更可重用的代码。了解它们的区别以及如何使用它们可以大大提高您编写简洁高效的 C# 程序的能力。通过利用这些委托,您可以创建更抽象、更高级的方法,这些方法可对各种数据类型和操作进行操作。