📅  最后修改于: 2023-12-03 15:22:09.908000             🧑  作者: Mango
在 C# 中,我们可以将一个方法作为另一个方法的参数进行传递。将方法作为参数传递的好处在于可以使代码更加灵活、可重用,并且减少了代码的重复性。同时,这也是一种常用的面向对象编程方法。
在 C# 中,我们使用委托(Delegate)来实现将方法作为参数传递的功能。委托是一种类似于函数指针的类型,它可以用于引用一个或一组方法,并调用这些方法。委托可以看做是一个函数指针,不过它是面向对象的,既可以引用静态方法,也可以引用实例方法。委托可以在运行时绑定到一组方法上,使得方法的执行更加灵活。
下面是一个简单的示例,演示如何使用委托将方法作为参数传递。首先定义一个委托类型,用于引用方法:
delegate int MyDelegate(int a, int b);
上述代码定义了一个委托类型 MyDelegate
,它可以引用一个返回值为 int
,参数列表为 (int a, int b)
的方法。接下来定义一个函数 MyFunc
,接收一个 MyDelegate
类型的参数 callback
,并调用 callback
引用的方法:
static void MyFunc(int x, int y, MyDelegate callback)
{
int z = callback(x, y);
Console.WriteLine(z);
}
上述代码定义了一个函数 MyFunc
,它接收三个参数:整数 x
、整数 y
和一个类型为 MyDelegate
的委托参数 callback
。在函数内部,我们调用了委托参数 callback
引用的方法,并将返回值输出到控制台。
接下来,我们定义两个示例方法,用于演示如何将它们作为参数传递:
static int Add(int a, int b)
{
return a + b;
}
static int Multiply(int a, int b)
{
return a * b;
}
上述代码定义了两个示例方法 Add
和 Multiply
,分别实现整数加法和乘法。
最后,我们将这些方法作为参数传递给 MyFunc
方法,并观察它们的输出:
MyDelegate addDelegate = new MyDelegate(Add);
MyDelegate multiplyDelegate = new MyDelegate(Multiply);
MyFunc(2, 3, addDelegate); // 输出 5
MyFunc(2, 3, multiplyDelegate); // 输出 6
上述代码中,我们使用 new
关键字创建了两个委托实例 addDelegate
和 multiplyDelegate
,分别引用 Add
和 Multiply
方法。接着我们将这两个委托实例作为参数传递给 MyFunc
方法,并观察它们的输出结果。
除了使用委托之外,C# 中还可以使用 Lambda 表达式来将方法作为参数传递。Lambda 表达式是一种快速定义匿名方法的方法,它可以用于创建委托实例,进而传递方法作为参数。下面是一个示例,演示如何使用 Lambda 表达式来将方法作为参数传递:
static void MyFunc(int x, int y, Func<int, int, int> callback)
{
int z = callback(x, y);
Console.WriteLine(z);
}
MyFunc(2, 3, (a, b) => a + b); // 输出 5
MyFunc(2, 3, (a, b) => a * b); // 输出 6
上述代码定义了一个函数 MyFunc
,它接收三个参数:整数 x
、整数 y
和一个类型为 Func<int, int, int>
的委托参数 callback
。Func<int, int, int>
是一个泛型委托类型,它可以引用一个返回值为 int
,参数列表为 (int a, int b)
的方法。
在第二部分的示例中,我们使用 Lambda 表达式来创建了两个匿名方法,并将它们作为参数传递给 MyFunc
方法。其中 (a, b) => a + b
表示一个返回整数加法的匿名方法,(a, b) => a * b
表示一个返回整数乘法的匿名方法。将两个匿名方法作为参数传递后,我们观察了它们的输出结果。