初學.Net的同學們,我們常常會有這樣一種感覺,對於一項技術,或者一個方法,我們都知道它很有用,可就是用不著,或者說,並不知道什麼地方能用的上,所以,技術學會了,卻用不上,也就無法深入。時間一長,就容易忘,結果就是,這個我學過,那個我也懂,可是我就不會用。。。
這博客園的第一篇博文,就從C#委托開始吧。
前段時間,做了一個局域網通訊工具的項目,在其中涉及到修改個人資料的模塊上,遇到了一個有些意思的問題,就是,當用戶在修改資料的窗體修改完個人頭像的時候,如何讓主窗體也隨之更新頭像,這裡,我想到幾種方法,第一,用多線程,第二,C#的Timer定時器,這兩種方法,其實都是讓程序每隔一定的時間刷新一下用戶頭像,確定可行,不過,用線程來做,實在有點小題大做,而且也涉及到線程間窗體調用的檢查,覺得得不嘗失,而定時器——老依靠控件並非明智之舉吧。何況我們有更好的辦法,對,就是委托。
在學C#時,我們都知道,委托是一個變量,可以把方法名當做一個值賦給它,這樣,我們就可以用這個委托變量來調用這個方法。當初在學的時候,相信大家都有感觸:明明調用一下方法就可以完成的事,為什麼又要搞個委托,繞個彎呢?
實際上,在很多情況下,我們並不能直接的調用方法,可能這個方法是private類型的,但又需要在外部來調用它,這時,就可以用委托來調用,下面舉一個例子來
這個程序,是在Form2中點擊選擇圖片,打開一個對話框後,選擇相應圖片,然後在Form1上顯示。這裡是在Form1中定義一個方法,方法是通過傳入的參數來修改本窗體的背景圖片,這個方法是private類型的,在Form2中是訪問不到的,那麼,就可以在Form1中定義一個委托和委托變量,然後把方法名賦值給它,當Form2中選擇完圖片後,執行調用該委托,就可以執行這個方法,完成Form1窗體背景的修改,下附代碼:
public partial class Form1 : Form
{
/// <summary>
/// 定義一個顯示圖片的委托
/// </summary>
/// <param name="img"></param>
public delegate void ShowPicture(Image img);
/// <summary>
/// 定義委托類型的變量 www.2cto.com
/// </summary>
public static ShowPicture OnPicSaved;
public Form1()
{
InitializeComponent();
OnPicSaved = ShowIt;//給變量賦值
}
/// <summary>
/// 修改窗體背景顏色的方法
/// </summary>
/// <param name="img"></param>
private void ShowIt(Image img)
{
this.BackgroundImage = img;
}
}
Form2中的代碼如下:
?
public Form2()
{
InitializeComponent();
Form1 frm1 = new Form1();
frm1.Show();//顯示Form1窗體
}
private void btnSelImg_Click(object sender, EventArgs e)
{
if (null == openFileDialog1.ShowDialog())//打開對話框
{
return;
}
//讓窗體中的PictureBox顯示圖片
picBoxShow.Image = Image.FromFile(openFileDialog1.FileName);
//調用Form1中的委托,更改Form1背景顏色
Form1.OnPicSaved(picBoxShow.Image);
}
}
就本人的理解,實現一個功能可以用很多方法,每一種方法代表一種思想,一種理念,對於這個例子,我們可以用線程或者定時器來做,讓Form1不斷的去判斷Form2是否選擇了新圖片,如果是,我就改。而用委托,則主動權交給了Form2,Form2選擇了圖片,來告訴我,我再改。沒有最好的方法,只有最合適的方法。比如在局域網用Socket通信時,同步阻止模式下,就需要開一個線程來處理與其他用戶的會話,這時選擇的是線程,而非委托。
其實來博客園,也可以很開心的寫一些簡簡單單的東西,並不是非要寫多麼高深多麼牛的技術文章,活在別人的眼光你,永遠找不到真實的自己。
摘自 白光