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
的方法,我们希望从中处理几个其他方法,例如 DASHBOARD
、WHEEL
、LIGHTS
等。为方便起见,我们将只使用两种方法:LIGHTS
和 MIRRORS
。
代码示例:
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
,在这种情况下,LIGHTS
、MIRRORS
和 CAR
都是同一个方法组的一部分。
C# 中方法组的简单自定义 Delegate
创建可以指向 METHOD GROUPS
的 DELEGATE
的简单方法如下所示。
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
的返回类型为 INT
和 18
不同的重载。必须定义参数类型,因为我们想用字符串"435"
调用 F_TEST
,我们将 PARAM2
定义为 STRING
。
即使只存在一个函数的重载,定义 PARAM2
也很重要;因为 METHOD GROUPS
是编译时结构,所以必须为单个重载选择它们。确保 PARAM2
至少包含一个过载是很重要的。
你还可以在函数中调用 List.Select(MethodGroup)
时删除 LINQ
中的强制转换。我们不会详细讨论 LINQ
上下文,因为本文关注 METHOD GROUPS
。
在 C# 中为方法组使用函数指针
仅当你在 METHOD GROUPS
中工作时,才需要从委托中指向不同的函数。在这种情况下,你必须确保返回类型和参数匹配。
C# 已经提供了一个 FUNC
关键字来允许指向不同的函数。就像指针通过指向对象和变量的地址然后调用它们来工作一样,你可以以相同的方式想象委托。
指针也往往具有与其寻址的对象相同的返回类型。由于函数的要求,代表还必须处理参数。
假设你想要将函数存储在数组中并为你的代码动态调用它们或将函数传递给要调用的其他函数时,需要指向函数。LAMBDA
函数也满足相同的要求。
然而,METHOD GROUPS
是具有遵循基本返回和参数类型的重载函数的常见集群。
相关文章
解压缩 C# 中的 Zip 文件
发布时间:2024/01/16 浏览次数:71 分类:编程语言
-
ZipFile.ExtractToDirectory()函数可用于解压缩 C# 中的压缩文件。使用 C# 中的 ZipFile.ExtractToDirectory() 函数解压缩文件
从 C# 中的字符串中删除字符
发布时间:2024/01/16 浏览次数:74 分类:编程语言
-
有 4 种主要方法可用于从 C# 中的字符串,string.Replace()函数,string.Join()和 string.Split()函数,Regex.Replace()函数以及 Linq 方法。
在 C# 中重复字符串 X 次
发布时间:2024/01/16 浏览次数:173 分类:编程语言
-
在 C# 中,可以使用三种主要方法将字符串重复 x 次:字符串类构造函数,StringBuilder 类和 LINQ 方法。用 C# 中的 string 类构造函数重复执行 X 次字符串
在 C# 中重复字符串
发布时间:2024/01/16 浏览次数:140 分类:编程语言
-
可使用三种主要方法在 C# 中重复字符串,String 构造函数,LINQ 中的 Enumerable.Repeat()函数以及 StringBuilder 类。
在 C# 中向数组中添加字符串
发布时间:2024/01/16 浏览次数:168 分类:编程语言
-
没有内置方法可以将新元素动态添加到 C# 中完全填充的数组中。使用 C# 中的 List.Add() 方法将字符串添加到数组
在 C# 中截断字符串
发布时间:2024/01/16 浏览次数:66 分类:编程语言
-
我们可以使用 C# 中的 String.Substring()方法创建一个字符串的截断副本。在 C# 中使用 String.Substring() 方法截断字符串
在 C# 中将字符串格式设置为货币格式
发布时间:2024/01/16 浏览次数:156 分类:编程语言
-
在 C# 中,可以使用两种主要方法将字符串格式化为货币格式,即 String.Format()和 ToString()函数。在 C# 中使用 String.Format() 方法将字符串格式化为货币
在 C# 中将字符串拆分为列表
发布时间:2024/01/16 浏览次数:123 分类:编程语言
-
我们可以使用 string.Split()函数和 C# 中的 Linq 的 ToList()函数,将可变的字符串转换为字符串列表。在 C# 中使用 String.Split() 方法将字符串变量拆分为字符串列表