本文參考自: 原文地址
學習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函數,我們也可以新增其他函數傳遞,用來比較兩個人的其他關係。
以上就是最近學習委託的一點心得,實際運用仍需更多案例。