程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#委托詳解

C#委托詳解

編輯:C#入門知識

初學.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通信時,同步阻止模式下,就需要開一個線程來處理與其他用戶的會話,這時選擇的是線程,而非委托。
  其實來博客園,也可以很開心的寫一些簡簡單單的東西,並不是非要寫多麼高深多麼牛的技術文章,活在別人的眼光你,永遠找不到真實的自己。

 


摘自 白光

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved