C# 委託系列(二)將方法綁定到委託

來源:互聯網
上載者:User
將方法綁定到委託

通過(一)的例子,是不是有那麼點如夢初醒的感覺?於是,你是不是在想:在上面的例子中,我不一定要直接在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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.