c#
前言:关于什么是委托可以参照这篇博客 委托
委托常用操作合集
创建
- 大致格式如下例
public delegate void operation(int a,int b);
声明&实例化&赋值
- 调用构造方法,new一个委托的同时,将需要绑定的方法作为参数传进去
如:GetAString a = new GetAString(x.ToString);
- 创建一个委托,直接将需要绑定的方法赋值给当前委托
如:GetAString a = s.ToString;
- 也可以使用匿名方法和Lambda表达式来对其赋值,详情参照后面的匿名方法标题下的内容
调用
- 对象名后跟括号
如: a(); - Invoke方法
如:a.Invoke();
多播委托
- 用+=运算可以为一个委托绑定一个新的方法。
- 用-=运算可以为一个委托接触与一个方法的绑定。
- 前提是返回值和参数对的上
- 多播委托调用方法的顺序和添加方法的顺序一致
- 多播委托只能得到最后调用的一个方法的返回值
- 多播委托中若某个方法发生了异常,则整个迭代就会停止
- 调用GetInvocationList()方法可以将委托中绑定的每个方法单独绑定一个委托作为一个委托集合返回
Delegate[] delegates = a1.GetInvocationList();
特性
- 委托类型可以引用到一个静态方法,也可以引用类里的普通方法
- 委托可以作为方法的参数
- 当一个委托没有指向任何方法的时候其为空(null),调用会出现空指针异常
Action委托
- 内置的默认是没有返回值和参数的委托
- 永远没有返回值,但可以有参数,可以在声明的时候使用泛型来定义其参数
如:Action<int,int> a;
意为无返回值,参数为int,int的委托
Func委托
- 内置的默认是没有返回值和参数的委托
- 但是可以通过生明的时候使用泛型,来定义其参数和返回值,最后一个参数为返回值,之前的为参数
如:Func<int,int,string> a;
意为返回值为string,参数为int,int的委托。
匿名方法
- 匿名方法本质上也是一个方法,不过其随用随写,没有取名字,故直接叫匿名方法。
- 一般通过赋值给委托来调用
- 声明匿名方法需要用到delegate关键字,另外函数体最后的}外面要加分号表示结束
- 举个例子:
Func<int,int,int> plus = delegate(int arg1,int arg2)
{
return arg1 + arg2;
};
Lambda表达式
- 与匿名方法类似,只是简化了书写方法
- 不需要写关键字,不需要写变量类型(因为委托已经定义好了类型),参数与函数体之间写上=>
- 举个例子:
Func<int,int,int> plus = (arg1,arg2)=>
{
return arg1 + arg2;
};
- 当函数只有一个参数的时候可以不加括号,当函数的方法体只有一句时也可以不加大括号,不写return语句。
事件
- 事件是一种特殊的委托,基本的使用方法与委托没有很大的区别
- 声明:事件仅可在类中声明,作为类的属性来出现,在委托类型前加上event关键字
例如:
public delegate void operation(int a,int b);//首先定义一个委托
class Abc{
public event operation op;//在类中声明一个该类型的事件
}
- 使用:事件可以像委托一样使用+=和-=来绑定和解除一个方法,但是事件不可以在类的外部直接触发,一般仅在类的外部为其绑定方法,触发都是在类内部做的。这样设定比委托更加安全