May 2025
Intermediate to advanced
1086 pages
14h 54m
Chinese
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在本章中,我们将介绍以第 2章和第3 章中探讨的概念为基础的高级 C# 主题。你应该按顺序阅读前四节,其余各节可以任意顺序阅读。
委托是一个知道如何调用方法的对象。
委托类型定义了委托实例可调用的方法类型。具体来说,它定义了方法的返回类型和参数类型。下面定义了一个名为Transformer 的委托类型:
delegate int Transformer (int x);
Transformer 兼容任何返回类型为 、参数为 的方法,例如 this:int int
int Square (int x) { return x * x; }
或者说得更直白一些:
int Square (int x) => x * x;
将方法分配给委托变量会创建一个委托实例:
Transformer t = Square;
调用委托实例的方式与调用方法相同:
int answer = t(3); // answer is 9
下面是一个完整的例子:
Transformer t = Square; // Create delegate instance int result = t(3); // Invoke delegate Console.WriteLine (result); // 9 int Square (int x) => x * x; delegate int Transformer (int x); // Delegate type declaration
委托实例实际上是调用者的委托:调用者调用委托,然后委托调用目标方法。这种间接方式将调用者与目标方法分离开来。
声明
Transformer t = Square;
的简称:
Transformer t = new Transformer (Square);
从技术上讲,当我们在不带括号或参数的情况下引用Square 时,我们是在指定一个方法组。如果方法是重载的,C# 将根据分配给它的委托的签名选择正确的重载。
表达方式
t(3)
是
t.Invoke(3)
委托类似于回调,回调是一个通用术语,用于捕捉 C 函数指针等构造。
委托变量在运行时被分配给一个方法。这对于编写插件方法非常有用。在本例中,我们有一个名为Transform 的实用程序方法,该方法可对整数数组中的每个元素进行变换。Transform 方法有一个委托参数,可用于指定插件变换:
int[] values = { 1, 2, 3 };
Transform (values, Square); // Hook in the Square method
foreach (int i in values)
Console.Write (i + " "); // 1 4 9
void Transform (int[] values, Transformer t)
{
for (int i = 0; i < values.Length; i++)
values[i] = t (values[i]);
}
int Square (int x) => x * x;
int Cube (int x) => x * x * x;
delegate int Transformer (int x);
我们只需将第二行代码中的Square 改为Cube ,就可以改变转换。 ...
Read now
Unlock full access