一、什么是委托
可以抽象的把委托理解为,就是把一个方法的引用给到一个变量。
二、委托的定义与使用
-
定义一个委托
privat delegate void MyDelegate();//用MyDelegate声明的变量,能够指向这个变量的方法只能是无参数,无返回值的方法。这条语句执行完相当于新建了一个类。 -
给委托指定一个方法
MyDelegate a=Test;//这是一种常见给委托赋值的方法
MyDelegate a=new MyDelegate(Test);//通过构造函数进行赋值。
private void Test(){
console.WriteLine(“Test”);
}
/说明
委托的方法可以是成员方法,也可以是静态方法。 -
调用委托
a();//调用委托与调用方法一样。
三、C#预制的Action与Func类
-
Action与Func的区别
(1)Action 是用来指定一个没有参数没有返回值的方法。先可以这样理解可以通过泛型让他有参数。
(2)Action<类型> 这样Action就可以指定没有返回值,有参数列表的方法了,如果多个参数Action<参数1,参数2…>
(3)Func 如果不使用泛型的写法也是指定一个没有参数,没有返回值的方法。
(4)Func<参数1,参数2,参数3…返回值> 只有最后一个是返回值,其他的都是参数。 -
Action与Func的使用
(1)Action的使用
privte Action a=Text;//这里需要在方法的外部
a(2);//方法的内部
private void Test(int n){ console.WriteLine(n);}
(2)Func的使用
private Func<int,int,int> a=Test;//方法的外部
a(2,4);
private int Test(int i1,int i2){ return i1+i2;}
四、多播委托
(1)什么是多播委托:可以理解为一个委托类型的变量可以指定多个方法;
(2)使用多播委托:
private Action a;
a = Test;
a+=Test1;
a+=Test2;
a();//会输出Test、Test1、Test2的方法体。
private void Test(){
console.writeLine(“Test”);
}
private void Test1(){
console.writeLine(“Test1”);
}
private void Test2(){
console.writeLine(“Test2”);
}
/说明
如果不想要某个方法直接使用a-=Test;
五、匿名方法与lambda表达式
-
什么是匿名方法:顾名思义匿名方法就是没有名字的方法
-
创建一个匿名方法
private Action a=delegate (){}; -
什么是lambda表达式: 可以理解为是一种可以替代匿名方法的
-
创建一个Lambda表达式
private Func<int,int,int> a=(i1,i2)=>{return i1+i2;};
六、委托与事件的区别
- 什么是事件:可以理解为事件是一种特殊的委托,只能+=,-=,并且是能在类内被调用。这也是他也委托的区别
- 应用(观察者设计模式)