本文参考自: 原文地址
学习C#语言到了委托事件这块就感觉比较抽象,因而做笔记方便理解。
委托:函数的包装,让函数可以作为参数进行使用(C++里的函数指针)。
委托一个重要的作用是实现方法回调,使得我们在添加方法时更利于拓展,而不用频繁修改逻辑判断部分
namespace weituo{
//定义委托 - 访问修饰符 delegate 返回值类型 委托名(参数列表);
public delegate void Something(string name);
public class Student{
//可以像普通类型一样当做方法参数传递
public void Do(Something something){
//可以像普通方法一样调用
//真正调用了方法A - 方法回调
something(name);
}
public Student(string name){
this.name = name;
}
private string name;
}
public class Teacher{
public void Hungry(){
Student s = new Student("老王");
//创建委托变量
Something a = new Something(A);
Something b = new Something(B);
Something c = a + b;
委托对象可以使用+ - 来绑定、解除绑定其他委托变量
c = c - a;
s.Do(c);
}
public void A(sting name){
Console.WriteLine("Hello,"+name);
}
public void B(sting name){
Console.WriteLine(name+"为老师买早饭");
}
}
class MainClass{
public static void Main(string[] args){
Teacher t = new Teacher();
t.Hungry();
}
}
}
上述例子,1、将委托作为参数封装在学生的Do(Something something)函数中,如此,2、老师若要学生完成指定的A或B方法,便可以将老师的函数直接传递过去A(string name)、B(string name)。
概括下即:老师饿了(Hungry),在Hungry函数中通过创建的委托变量,修改增添AB方法,并传递到学生已封装好的带有委托传递的Do函数里,最后调用老师的AB方法(方法回调),学生就为老师买好了早饭。
namespace weituo1{
class Person{
public delegate int MyDelegate(int num1,int num2);
public int Compare(int n1,int n2){
return n1 > n2 ? n1 : n2;
}
public void func(MyDelegate dd,int nn1,int nn2){
int result = dd(nn1,nn2);
Console.WriteLine(result);
}
}
class MainClass{
public static void Main (string[] args){
Person p = new Person();
p.func(p.Compare,10,20);
}
}
上述案例更简洁,我们在Main类中负责比较两个人的年龄,那么首先调用person类里的func函数,由func再负责传递compare函数,我们也可以新增其他函数传递,用来比较两个人的其他关系。
以上就是最近学习委托的一点心得,实际运用仍需更多案例。