- 委託(delegate)簡單來看就是一種指向方法的引用對象。其實,delegate就是一個類,其持有所指向的方法的地址。
- 委託可以引用一個方法,也可以應用多個方法,當引用多個方法的時候,稱之爲多路廣播(多播)。
- 委託既可以引用靜態方法,也可以應用實例方法。
下面先看委託對靜態方法的引用:
//定義一個委託,使用關鍵字delegate,其後面的int是委託引用的方法的返回值;
//NumberChanger是委託名,括號內是委託引用的方法的參數類型。
delegate int NumberChanger(int num);
class NumChanger
{
static int num = 10;
//靜態方法AddNum()
public static int AddNum(int n)
{
num += n;
return num;
}
//靜態方法MultiNum()
public static int MultiNum(int n)
{
num *= n;
return num;
}
public static int GetNum()
{
return num;
}
public static void Main()
{
//實例化委託nc,並引用靜態方法AddNum()
NumberChanger nc = new NumberChanger(AddNum);
//實例化委託nc2,並引用靜態方法NultiNum()
NumberChanger nc2 = new NumberChanger(MultiNum);
//執行委託nc引用的方法
nc(5);
Console.WriteLine("num is {0}", GetNum());
//執行委託nc2引用的方法
nc2(10);
Console.WriteLine("num is {0}", GetNum());
}
}
上面這兩個委託都只引用一個方法。
代碼nc(5)實際就是指向靜態方法AddNum(5);
代碼nc2(10)實際就是指向靜態方法MultiNum(10);
執行結果如下:
當我們使用一個委託去引用多個方法時(多播),代碼修改如下:
//定義一個委託,使用關鍵字delegate,其後面的int是委託引用的方法的返回值;
//NumberChanger是委託名,括號內是委託引用的方法的參數類型。
delegate int NumberChanger(int num);
class NumChanger
{
static int num = 10;
//靜態方法AddNum()
public static int AddNum(int n)
{
Console.WriteLine("執行了AddNum方法!");
num += n;
return num;
}
//靜態方法MultiNum()
public static int MultiNum(int n)
{
Console.WriteLine("執行了MultiNum方法!");
num *= n;
return num;
}
public static int GetNum()
{
return num;
}
public static void Main()
{
//實例化委託nc,並引用靜態方法AddNum()
NumberChanger nc = new NumberChanger(AddNum);
nc += MultiNum;
//執行委託nc引用的方法
nc(5);
Console.WriteLine("num is {0}", GetNum());
}
}
上面Main方法中的代碼還可以採用下面這樣,實際是一樣的:
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultiNum);
nc = nc1;
nc += nc2;
nc(5);
Console.WriteLine("num is {0}", GetNum());
代碼運行結果:
接下來是委託對實例方法的引用:
//定義一個委託
delegate string NumToString(int num);
class NumToStr {
//定義實例方法getString()
public string getString(int num) {
return Convert.ToString("這是字符串:"+num);
}
//定義實例方法addStr()
public string addStr(int num) {
return "這是拼接後的字符串"+num+"-後綴-";
}
//Main方法
public static void Main(String[] args)
{
//將實例方法getString()引用到委託n1
NumToString n1 = new NumToString(new NumToStr().getString);
Console.WriteLine(n1(55));
//將實例方法addStr()引用到委託n2
NumToString n2 = new NumToString(new NumToStr().addStr);
Console.WriteLine(n2(110));
}
}
代碼執行結果如下:
對於實例方法的多播跟靜態方法沒有什麼區別,同樣是需要對實例方法所屬的類進行實例化後傳入到委託的參數當中。
總結:
- 簡單理解委託就是用來執行方法的一個東西。
- 委託是將方法的引用封裝在委託對象內,然後可以將該委託對象傳遞給可調用所引用方法的代碼,而不必在編譯時知道將調用哪個方法。
- 委託還可以將一些方法集成到一塊執行。
以上是我最近一些理解,後面有更深的體會後會進行補充修改。