將方法綁定到委託
通過(一)的例子,是不是有那麼點如夢初醒的感覺?於是,你是不是在想:在上面的例子中,我不一定要直接在GreetPeople()方法中給 name參數賦值,我可以像這樣使用變數:
static void Main(string[] args) {
string name1, name2;
name1 = "Jimmy ";
name2 = "半支煙";
GreetPeople(name1, EnglishGreeting);
GreetPeople(name2, ChineseGreeting);
Console.ReadKey();
}
而既然委託GreetingDelegate 和 類型 string 的地位一樣,都是定義了一種參數類型,那麼,我是不是也可以這麼使用委託?
static void Main(string[] args) {
GreetingDelegate delegate1, delegate2;
delegate1 = EnglishGreeting;
delegate2 = ChineseGreeting;
GreetPeople("Jimmy", delegate1);
GreetPeople("半支煙", delegate2);
Console.ReadKey();
}
如你所料,這樣是沒有問題的,程式一如預料的那樣輸出。這裡,我想說的是委託不同於string的一個特性:可以將多個方法賦給同一個委託,或者叫將多個方法綁定到同一個委託,當調用這個委託的時候,將依次調用其所綁定的方法。在這個例子中,文法如下:
static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先給委託類型的變數賦值
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
// 將先後調用 EnglishGreeting 與 ChineseGreeting 方法
GreetPeople("Jimmy ", delegate1);
Console.ReadKey();
}
輸出為:
Morning, Jimmy
早上好, Jimmy
實際上,我們可以也可以繞過GreetPeople方法,通過委託來直接調用EnglishGreeting和ChineseGreeting:
static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先給委託類型的變數賦值
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
// 將先後調用 EnglishGreeting 與 ChineseGreeting 方法
delegate1 ("Jimmy ");
Console.ReadKey();
}
NOTE:這在本例中是沒有問題的,但回頭看下上面GreetPeople()的定義,在它之中可以做一些對於EnglshihGreeting和ChineseGreeting來說都需要進行的工作,為了簡便我做了省略。
注意這裡,第一次用的“=”,是賦值的文法;第二次,用的是“+=”,是綁定的文法。如果第一次就使用“+=”,將出現“使用了未賦值的局部變數”的編譯錯誤。
我們也可以使用下面的代碼來這樣簡化這一過程:
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
看到這裡,應該注意到,這段代碼第一條語句與執行個體化一個類是何其的相似,你不禁想到:上面第一次綁定委託時不可以使用“+=”的編譯錯誤,或許可以用這樣的方法來避免:
GreetingDelegate delegate1 = new GreetingDelegate();
delegate1 += EnglishGreeting; // 這次用的是 “+=”,綁定文法。
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
但實際上,這樣會出現編譯錯誤: “GreetingDelegate”方法沒有採用“0”個參數的重載。儘管這樣的結果讓我們覺得有點沮喪,但是編譯的提示:“沒有0個參數的重載”再次讓我們聯想到了類的建構函式。我知道你一定按捺不住想探個究竟,但再此之前,我們需要先把基礎知識和應用介紹完。
既然給委託可以綁定一個方法,那麼也應該有辦法取消對方法的綁定,很容易想到,這個文法是“-=”:
static void Main(string[] args) {
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
// 將先後調用 EnglishGreeting 與 ChineseGreeting 方法
GreetPeople("Jimmy ", delegate1);
Console.WriteLine();
delegate1 -= EnglishGreeting; //取消對EnglishGreeting方法的綁定
// 將僅調用 ChineseGreeting
GreetPeople("半支煙", delegate1);
Console.ReadKey();
}
輸出為:
Morning, Jimmy
早上好, Jimmy
早上好, 半支煙
讓我們再次對委託作個總結:
使用委託可以將多個方法綁定到同一個委託變數,當調用此變數時(這裡用“調用”這個詞,是因為此變數代表一個方法),可以依次調用所有綁定的方法。
轉自:http://hi.baidu.com/txh1204將方法綁定到委託
通過(一)的例子,是不是有那麼點如夢初醒的感覺?於是,你是不是在想:在上面的例子中,我不一定要直接在GreetPeople()方法中給 name參數賦值,我可以像這樣使用變數:
static void Main(string[] args) {
string name1, name2;
name1 = "Jimmy ";
name2 = "半支煙";
GreetPeople(name1, EnglishGreeting);
GreetPeople(name2, ChineseGreeting);
Console.ReadKey();
}
而既然委託GreetingDelegate 和 類型 string 的地位一樣,都是定義了一種參數類型,那麼,我是不是也可以這麼使用委託?
static void Main(string[] args) {
GreetingDelegate delegate1, delegate2;
delegate1 = EnglishGreeting;
delegate2 = ChineseGreeting;
GreetPeople("Jimmy", delegate1);
GreetPeople("半支煙", delegate2);
Console.ReadKey();
}
如你所料,這樣是沒有問題的,程式一如預料的那樣輸出。這裡,我想說的是委託不同於string的一個特性:可以將多個方法賦給同一個委託,或者叫將多個方法綁定到同一個委託,當調用這個委託的時候,將依次調用其所綁定的方法。在這個例子中,文法如下:
static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先給委託類型的變數賦值
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
// 將先後調用 EnglishGreeting 與 ChineseGreeting 方法
GreetPeople("Jimmy ", delegate1);
Console.ReadKey();
}
輸出為:
Morning, Jimmy
早上好, Jimmy
實際上,我們可以也可以繞過GreetPeople方法,通過委託來直接調用EnglishGreeting和ChineseGreeting:
static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先給委託類型的變數賦值
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
// 將先後調用 EnglishGreeting 與 ChineseGreeting 方法
delegate1 ("Jimmy ");
Console.ReadKey();
}
NOTE:這在本例中是沒有問題的,但回頭看下上面GreetPeople()的定義,在它之中可以做一些對於EnglshihGreeting和ChineseGreeting來說都需要進行的工作,為了簡便我做了省略。
注意這裡,第一次用的“=”,是賦值的文法;第二次,用的是“+=”,是綁定的文法。如果第一次就使用“+=”,將出現“使用了未賦值的局部變數”的編譯錯誤。
我們也可以使用下面的代碼來這樣簡化這一過程:
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
看到這裡,應該注意到,這段代碼第一條語句與執行個體化一個類是何其的相似,你不禁想到:上面第一次綁定委託時不可以使用“+=”的編譯錯誤,或許可以用這樣的方法來避免:
GreetingDelegate delegate1 = new GreetingDelegate();
delegate1 += EnglishGreeting; // 這次用的是 “+=”,綁定文法。
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
但實際上,這樣會出現編譯錯誤: “GreetingDelegate”方法沒有採用“0”個參數的重載。儘管這樣的結果讓我們覺得有點沮喪,但是編譯的提示:“沒有0個參數的重載”再次讓我們聯想到了類的建構函式。我知道你一定按捺不住想探個究竟,但再此之前,我們需要先把基礎知識和應用介紹完。
既然給委託可以綁定一個方法,那麼也應該有辦法取消對方法的綁定,很容易想到,這個文法是“-=”:
static void Main(string[] args) {
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
// 將先後調用 EnglishGreeting 與 ChineseGreeting 方法
GreetPeople("Jimmy ", delegate1);
Console.WriteLine();
delegate1 -= EnglishGreeting; //取消對EnglishGreeting方法的綁定
// 將僅調用 ChineseGreeting
GreetPeople("半支煙", delegate1);
Console.ReadKey();
}
輸出為:
Morning, Jimmy
早上好, Jimmy
早上好, 半支煙
讓我們再次對委託作個總結:
使用委託可以將多個方法綁定到同一個委託變數,當調用此變數時(這裡用“調用”這個詞,是因為此變數代表一個方法),可以依次調用所有綁定的方法。
轉自:http://hi.baidu.com/txh1204