C#——委托

106 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自System.Delegate类。

委托是函数(方法)的容器,可以理解为表示函数(方法)的变量类型,委托用来存储、传递函数(方法)。委托的本质是一个类,用来定义函数(方法)的类型(返回值和参数的类型)。不同的函数(方法)必须对应和各自格式一致的委托。

委托的关键字为:delegate。委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

delegate void MyDel(int x);

委托类型声明的要求:

(1)以deleagate关键字开头。

(2)返回类型+委托类型名+参数列表。

语法:访问修饰符 delegate 返回值 委托名(参数列表);

我们可以申明在namespace和class语句块中,但更多的写在namespace中。

简单记忆委托语法就是函数申明语法前面加一个delegate关键字。

定义自定义委托

访问修饰默认不写,为public在别的命名空间中也能使用,private其他命名空间就不能用了,大部分时候我们会选择使用public。

委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。

例如,假设有一个委托:

public delegate int MyDelegate (string s);

上面的委托可被用于引用任何一个带有一个单一的 string 参数的方法,并返回一个 int 类型变量。

声明委托的语法如下:

delegate <return type> <delegate-name> <parameter list>;

我们可以申明一个可以用来存储无参无返回值函数的容器,它只是定义了规则,并没有使用

Delegate void MyFun();

委托规则的申明在同一语句块中不允许重名,表示用来装载或传递返回值int,有一个int参数的函数的委托的容器规则。

Delegate void MyFun2(int a);

实例化委托

一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。例如:

public delegate void printString(string s);  
...  
printString ps1 = new printString(WriteToScreen);  
printString ps2 = new printString(WriteToFile);