文章目錄
PDF版下載:第2章-C#中的委託和事件
這個是完整的第2章,C#中的委託和事件,按照編輯要求,排版比較散,實際沒那麼多頁的,成書時估計也就40頁。初稿,還會有較大改動。這是寫作前期的最後一篇樣章。
2.5.4 匿名方法的使用(新補充)
我們現在來做一個小程式:建立一個Windows表單應用程式,然後在預設建立的Form1上添加兩個按鈕,分別命名為btnClickMe1和btnClickMe2,顯示的文本為“點擊我1”、“點擊我2”,如所示:
然後我們希望在點擊這兩個按鈕的時候,能夠彈出一個對話方塊,向使用者顯示一個提示,例如“您好,我的讀者,希望您能喜歡本書!”(順便一提,我是真心這麼希望的^^)。如果在往常,你可能會毫不猶豫的在按鈕上雙擊,然後編寫按鈕的事件處理代碼,但是我們現在在講委託和事件,所以讓我們換一種方式,像下面這樣修改Form1.cs檔案:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
btnClickMe1.Click += new EventHandler(btnClickMe_Click);
btnClickMe2.Click += new EventHandler(btnClickMe_Click);
}
void btnClickMe_Click(object sender, EventArgs e) {
MessageBox.Show("您好,我的讀者,希望您能喜歡本書!");
}
}
我知道這段代碼現在已經不會為你造成任何障礙了,所以就不費時間解釋它了。但是我們的第一個反應就是代碼重用了,因為兩個Click事件共用了同一個事件處理方法。接下來我們再思考一下,像這種兩個按鈕共用同一個Click事件處理方法的情況並不多見,現在讓我們刪除掉btnClickMe2,僅保留一個btnClickMe1,好了,現在你看出問題了嗎?btnClickMe_Click()方法僅僅是為btnClickMe1服務,但是它們卻離得如此之遠,以至於我們在表單代碼很多的情況下(你可以想像一下表單有幾百行代碼,而btnClickMe_Click()隱藏在一個小角落裡)不得不花些時間來尋找它。我們會想,要是有一種文法,能夠直接將方法體付給btnClickMe1的Click事件就好了,比如說像下面這樣:
btnClickMe1.Click += {
MessageBox.Show("您好,我的讀者,希望您能喜歡本書!");
};
現在你應該知道我要講什麼了,這就是本小節的主題――匿名方法,只不過上面的代碼還需要再做一點修改,因為我們還缺少了一樣東西,就是方法的簽名:
btnClickMe1.Click += delegate(object sender, EventArgs e) {
MessageBox.Show("您好,我的讀者,希望您能喜歡本書!");
};
OK,現在運行程式,你可以發現程式已經運轉如常了。但是仔細看看這段代碼,你是否還能發現問題?好吧,我向你提示一下:方法體既沒有使用參數sender,也沒有使用參數e,但是為了讓編譯器通過,我們卻把它們添加了進來,這樣是不是很冗餘?為瞭解決這個問題,C#又提供了一種更簡潔的文法,在你不使用方法參數時使用,就好像我們現在這種情況:
btnClickMe1.Click += delegate{
MessageBox.Show("您好,我的讀者,希望您能喜歡本書!");
};
這和我們上面的推斷幾乎完全一樣,只是多了個delegate關鍵字而已,是不是很方便的能力?下次編寫代碼時,你就可以試著使用一下它,這樣會使你的印象更加牢固。