委托是什么?
-
委托(delegate)是函数指针的升级版。
学过C/C++的小伙伴都知道函数指针,函数指针就是指向函数的指针。
include<studio.h> int (*Calc)(int a,int b);//声明一个返回int类型的函数指针类型。 int Add (int a,int b) { return a+b; } int Sub(int a,int b) { return a-b; } int main() { int x = 100; int y = 50; int z = 0; Calc funcPoint1 = &Add; Calc funcPoint2 = ⋐ z = funcPoint1(x,y); printf("%d+%d=%d ",x,y,z); z = funcPoint2(x,y); printf("%d-%d=%d ",x,y,z); system("pause"); return 0; }
这里提一下java没有函数指针的概念。Java 语言由 C++ 发展而来,为了提高应用安全性,Java 语言禁止程序员直接访问内存地址。即 Java 语言把 C++ 中所有与指针相关的内容都舍弃掉了。
-
委托的简单使用
通常情况下我们直接使用C#内置的委托实例更简单。Action 和 Func 是 C# 内置的委托实例,它们都有很多重载以方便使用。
class Program { static void Main(string[] args) { var calculator = new Calculator(); // Action 用于无形参无返回值的方法。 Action action = new Action(calculator.Report); calculator.Report(); action.Invoke(); // 模仿函数指针的简略写法。 action(); Func<int, int, int> func1 = new Func<int, int, int>(calculator.Add); Func<int, int, int> func2 = new Func<int, int, int>(calculator.Sub); int x = 100; int y = 200; int z = 0; z = func1.Invoke(x, y); Console.WriteLine(z); z = func2.Invoke(x, y); Console.WriteLine(z); // Func 也有简略写法。 z = func1(x, y); Console.WriteLine(z); z = func2(x, y); Console.WriteLine(z); } } class Calculator { public void Report() { Console.WriteLine("I have 3 methods."); } public int Add(int a, int b) { return a + b; } public int Sub(int a, int b) { return a - b; } }
委托的声明
委托是一种类:
static void Main(string[] args) { Type t = typeof(Action); Console.WriteLine(t.IsClass); }
//console:true;
委托是类,所以声明位置是和 class 处于同一个级别。但 C# 允许嵌套声明类(一个类里面可以声明另一个类),所以有时也会有 delegate 在 class 内部声明的情况。
public delegate double Calc(double x, double y); class Program { static void Main(string[] args) { var calculator = new Calculator(); var calc1 = new Calc(calculator.Mul); Console.WriteLine(calc1(5, 6)); } } class Calculator { public double Mul(double x, double y) { return x * y; } public double Div(double x, double y) { return x / y; } }