C#委派
來源:互聯網
上載者:User
C#語言系列講座
委派
--------------------------------------------------------------------------------
委派
委派是C#引入的一種新的資料類型,它非常類似於C/C++中的函數指標,常常用於在編譯時間未綁定的動態方法引動過程。與函數指標不同的是委派在C#中完全實現了物件導向,它既可以引用靜態方法,也可以引用執行個體方法,而函數指標只能引用靜態方法。C#中的委派同時也是型別安全的。
作為一種物件導向的資料類型,委派的使用分為三步:委派聲明,委派執行個體化和委派調用。委派聲明就是定義一個封裝特定參數類型和傳回值類型的方法體(靜態方法或執行個體方法)的資料類型,看下面的樣本:
delegate int Compute (int left, int right);
可以看到,委派類型Compute包含了方法的兩個要素: 參數類型和傳回值類型。委派類型和方法只有滿足下面兩個條件,才能說它們是相容的:
1. 參數的數量相同,並且它們的類型也按順序相同;
2. 傳回值相同。
委派類型相同指的是它們聲明的類型為同一類型(名字一樣)。而委派執行個體相等則是指它們綁定的方法為同一個方法,或相同的方法按相同的順序組成的方法鏈,而它們本身的類型只要相容即可(同樣滿足上面兩個條件),不必強求同名。
委派執行個體化就是將委派類型綁定到特定方法的過程,和其他對象的執行個體化相似,都需要用new語句,只是必須接受和該委派類型相容的方法名作為new語句的參數。如果是執行個體方法,必須採用兩者中間加點號的方式同時提供執行個體對象和方法。
委派執行個體化後就可以像調用方法一樣進行委派調用了。下面是一個完整的例子,比較典型地展示了通常使用委派的三個步驟:
using System;
delegate int Compute(int left, int right);
//委派型別宣告
class A
{
public int Mul(int num1, int num2)
{ return num1*num2;
}
}
class Test
{
public static int Add(int num1, int num2)
{ return num1+num2;
}
static void Main()
{ Compute c1=new Compute(Add);
//靜態方法的執行個體化
A a=new A();
Compute c2=new Compute(a.Mul);
//執行個體方法的執行個體化
int r1=c1(2,3);//委派調用
int r2=c2(2,3);//委派調用
Console.WriteLine(r1);
Console.WriteLine(r2);
}
}
委派組合
委派組合是指一個委派類型可以同時綁定多個可調用的方法。由於綁定多個方法,C#規定組合委派的傳回型別必須為void。當然,這些方法的參數類型也必須都和組合委派的參數類型相容。委派組合採用“+”或“+=”來將兩個委派類型合并為一個新的組合委派類型; 採用“-”或“-=”來從組合委派類型上移除已經綁定一個方法的委派執行個體或綁定多個方法的組合委派執行個體。
需要注意的是在做委派的組合和移除操作的時候,參與操作的委派類型必須相同——注意是“相同”不是“相等”。看下面的例子:
using System;
delegate void MyDelegate(string s);
class Test
{
public static void Hello(string s)
{
Console.WriteLine(“Hello, {0}!”, s);
}
public static void Goodbye(string s)
{
Console.WriteLine(“Goodbye, {0}!”, s);
}
public static void Main()
{
MyDelegate a, b, c, d;
a = new MyDelegate(Hello);
b =new MyDelegate(Goodbye);
c = a + b;//委派的組合
d = c - a;//委派的移除
a(“A”);
b(“B”);
c(“C”);
d(“D”);
}
}
程式輸出:
Hello, A!
Goodbye, B!
Hello, C!
Goodbye, C!
Goodbye, D!
可以看到在委派組合後,組合委派類型C同時綁定了兩個方法Hello(string s)和Goodbye(string s),從它的輸出可以看到這一點。
需要注意的是組合委派中的方法調用是有順序的,如果在上面的例子中修改“c = a + b; ”為“c=b + a; ”,將看到輸出序列的改變。
同樣委派的移除也是有順序的,它總是從綁定的委派執行個體中的最後開始搜尋需要移出的委派執行個體——注意這裡的移除是以委派執行個體為單位的,而不是以方法為單位。可以將上面的例子進行修改,再看看結果:
public static void Main()
{
MyDelegate a, b, c, d;
a = new MyDelegate(Hello);
b =new MyDelegate(Goodbye);
c = a+b+a;//委派的組合
b+=b;//委派的組合
d = c - b;//委派的移除
a(“A”);
b(“B”);
c(“C”);
d(“D”);
}