C# 中的方法组

Bilal Shahid 2023年10月12日
  1. C# 中的方法组
  2. C# 中的 Delegates
  3. 在 C# 中使用 DELEGATE 进行方法组转换
  4. C# 中方法组的简单自定义 Delegate
  5. 在 C# 中为方法组使用函数指针
C# 中的方法组

本文将讨论 C# 中的方法组。

C# 中的方法组

我们有时会遇到一个函数可能有多个实现的情况。它可能有另一个具有完全不同的参数集或类型的定义,或者通常称为过载函数。

语法:

void print(int x) {
  ///...code
}

void print(int x, int y) {
  ///...code for x and y
}

这样的函数或方法称为方法组。

C# 中的 Delegates

DELEGATES 是指向创建的函数的指针。除了指向函数之外,它还定义了函数的返回类型及其参数。

比方说,一个名为 LAPTOP 的委托可以有一个返回类型为 void 和一个参数为 USERNAME(字符串)。我们还有另一个名为 PC 的函数,它也具有与 LAPTOP 相同的返回类型和参数类型。

在这种情况下,我们可以从委托 LAPTOP 调用 PC

代码示例:

delegate void LAPTOP(string username);

static void PC(string username) {
  Console.WriteLine("USER: " + username + " has logged in!");
}

static void Main() {
  LAPTOP lap1 = PC;
  lap1("Hydrogen");
}

你可以注意到我们已经用 PC 实例化了 LAPTOP 实例,稍后调用它会导致我们打印从 PC 方法传递的用户名。这就是 DELEGATES 的工作方式。

在 C# 中使用 DELEGATE 进行方法组转换

我们将研究方法组最常见的用途之一,以及在调用时如何处理它们。我们讨论了方法组如何成为基本方法的重载函数,并且我们可以通过使用 DELEGATES 根据需要使用方法组。

在我们的示例中,假设我们有一个名为 CAR 的方法,我们希望从中处理几个其他方法,例如 DASHBOARDWHEELLIGHTS 等。为方便起见,我们将只使用两种方法:LIGHTSMIRRORS

代码示例:

delegate void CAR(bool start);

static void MIRROR(bool start) {
  if (start)
    Console.WriteLine("Mirror is now working!");
  else
    Console.WriteLine("Mirror is not stopped/closed");
}

static void LIGHTS(bool start) {
  if (start)
    Console.WriteLine("Lights are now working!");
  else
    Console.WriteLine("Lights have stopped/closed");
}

现在我们已经定义了方法,让我们实现 MAIN 方法,我们使用委托来处理这些方法组。

CAR car = MIRROR;
car(true);

car = LIGHTS;
car(false);

你可以注意到 CAR 对象指向 MIRROR,但后来它指向 LIGHTS。然后调用该方法调用它指向的函数。

函数的名称被分配给 car 对象。将 DELEGATE 指针更改为指向其组中的不同方法称为 METHOD GROUP CONVERSION,在这种情况下,LIGHTSMIRRORSCAR 都是同一个方法组的一部分。

C# 中方法组的简单自定义 Delegate

创建可以指向 METHOD GROUPSDELEGATE 的简单方法如下所示。

Func<string> f_test = "AA".ToString;
Console.WriteLine(f_test());

调用上述将输出字符串 AA 作为结果。F_TEST 指向 ToString 方法并调用它。

你还可以注意到,此函数指向 ToString 方法的地址,而不是函数本身。这就是指针的工作原理。

下面提供了另一个示例以正确理解方法组。

Func<string, int> f_test = Convert.ToInt32;
Console.WriteLine(f_test("435"));

语法:

Func<param1, param2> name;
//param1 is the parameter passed in the function/method pointed to
//param 2 is the return type of that function/method that the delegate points to

由于 Convert.ToInt32 的返回类型为 INT18 不同的重载。必须定义参数类型,因为我们想用字符串"435"调用 F_TEST,我们将 PARAM2 定义为 STRING

即使只存在一个函数的重载,定义 PARAM2 也很重要;因为 METHOD GROUPS 是编译时结构,所以必须为单个重载选择它们。确保 PARAM2 至少包含一个过载是很重要的。

你还可以在函数中调用 List.Select(MethodGroup) 时删除 LINQ 中的强制转换。我们不会详细讨论 LINQ 上下文,因为本文关注 METHOD GROUPS

在 C# 中为方法组使用函数指针

仅当你在 METHOD GROUPS 中工作时,才需要从委托中指向不同的函数。在这种情况下,你必须确保返回类型和参数匹配。

C# 已经提供了一个 FUNC 关键字来允许指向不同的函数。就像指针通过指向对象和变量的地址然后调用它们来工作一样,你可以以相同的方式想象委托。

指针也往往具有与其寻址的对象相同的返回类型。由于函数的要求,代表还必须处理参数。

假设你想要将函数存储在数组中并为你的代码动态调用它们或将函数传递给要调用的其他函数时,需要指向函数。LAMBDA 函数也满足相同的要求。

然而,METHOD GROUPS 是具有遵循基本返回和参数类型的重载函数的常见集群。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

相关文章 - Csharp Method