C#基礎知識整理 基礎知識(20) 委託(一)

來源:互聯網
上載者:User
委託和事件在C#中使用很多,尤其在進行表單編程時,很多的操作都要通過委託和事件來處理和傳遞。這裡詳細解釋下委託和事件的用法和原因,使我們在寫代碼時能更加明白一些。
委託的使用
事件是一種機制,事件是通過委託實現的,所以看明白了委託,對於事件也就能更好的理解了。先看下面一個小例子。
這是描述不同語言的程式員的代碼:
比如使用C#的程式員我們這樣描述,其中programerName參數表示這個程式員的姓名。

        public void CsharpProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用C#編程!", programerName));        }

使用Java的,

        public void JavaProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用Java語言編程!"));        }

那麼這麼多語言,怎麼區分這是哪個程式員呢?使用一個枚舉來表示,

    public enum ProgramLanguage    {        CSharp,        C,        Java    }

那麼進行一個完整的描述,代碼如下:

   public class ProgramerDescription    {        //01        public void CsharpProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用C#編程!", programerName));        }        public void CProgramer(string programerName)        {            Console.WriteLine(string.Format("{0}使用C語言編程!", programerName));        }        public void JavaProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用Java語言編程!"));        }        //02        public void Description(string programerName, ProgramLanguage type)        {            switch (type)            {                case ProgramLanguage.CSharp:                    CsharpProgramer(programerName);                    break;                case ProgramLanguage.C:                    CProgramer(programerName);                    break;                case ProgramLanguage.Java:                    JavaProgramer(programerName);                    break;                default:                    Console.WriteLine("A kind of new Language that you never heard of.");                    break;            }        }    }    public enum ProgramLanguage    {        CSharp,        C,        Java    }

調用:

            ProgramerDescription pm = new ProgramerDescription();            pm.Description("楊友山", ProgramLanguage.CSharp);

這時,輸出"楊友山 使用C#編程!";
這樣就初步完成了一個對程式員描述的簡單實現。這裡的Description方法是通過一個枚舉類型來區別不同的語言。這樣它的維護性是比較差的,因為還有很多程式設計語言(C++,php,等),如果想加一種語言就要增加一個對應的方法,然後就要修改ProgramLanguage這個枚舉類型。增加方法對原程式影響不大,因為可以用部分類別來實現,而修改枚舉就不合適了,這也不符合物件導向設計思想的開放封閉原則。
那麼在Description方法中怎麼處理呢,也就是不用枚舉了,Description方法如何來區分該調用哪個方法(CsharpProgramer,CProgramer,JavaProgramer)對程式員進行描述。
public void Description(string programerName, 某類型 某參數)
{
//調用對應的方法
}
這裡的某類型就是要用它來區別哪個方法的類型,換句話說,最好就是在這裡我直接把我想要調用的方法當做參數傳進去。比如我要調用CProgramer方法來描述C程式員,
ProgramerDescription pm = new ProgramerDescription();

pm.Description("D.M.Ritchie", CProgramer);
按照這個想法,public string Description(string programerName, 某類型 某參數)的“某類型 某參數”該怎麼表示呢?
當然我們就想到C#中的委託delegate了。委託是一種資料結構,它引用靜態方法或引用類執行個體及該類的執行個體方法。 用委託來完成上述的代碼:

    public class ProgramDescriptionDelegate    {        //委託,表示方法        public delegate void DescriptionDelegate(string programerName);        //01        public void CsharpProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用C#編程!", programerName));        }        public void CProgramer(string programerName)        {             Console.WriteLine(string.Format("{0}使用C語言編程!", programerName));        }        public void JavaProgramer(string programerName)        {             Console.WriteLine(string.Format("{0} 使用Java語言編程!"));        }        //02        public void Description(string programerName, DescriptionDelegate description)        {            description(programerName);        }    }

調用:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();            pm.Description("楊友山", pm.CsharpProgramer);

結果是和最開始的代碼是一樣的。
什麼是委託?MSDN這樣解釋的:委託是一種定義方法簽名的類型,可以與具有相容簽名的任何方法關聯,可以通過委託調用方法。委託用於將方法作為參數傳遞給其他方法。時間處理常式就是通過委託調用的方法。

仔細看使用委託的代碼,
public void Description(string programerName, DescriptionDelegate description)。調用時,
DescriptionDelegate description傳入的是 pm.CsharpProgramer,也就是此時description=pm.CsharpProgramer。其實我們還可以這樣調用:

                    //方法和委託綁定            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate                csharpDelegate = pm.CsharpProgramer;            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate                cdelegate = pm.CProgramer;            pm.Description("楊友山", csharpDelegate);            pm.Description("D.M.Ritchie", cdelegate);

結果:

再做修改:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate                pdelegate = null;            pdelegate += pm.CsharpProgramer;            pdelegate += pm.CProgramer;            pm.Description("楊友山", pdelegate);

結果:

這裡先執行了pm.CsharpProgramer,然後又執行了pm.CProgramer方法。
可以看出委託不光可以將方法作為參數,而且還可以將方法綁定,而起還可以綁定多個。
使用+=Binder 方法,取消則使用-=進行取消,上面的調用可以修改如下:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate                pdelegate = null;            pdelegate += pm.CsharpProgramer;            pdelegate += pm.CProgramer;            pdelegate -= pm.CProgramer;            pm.Description("楊友山", pdelegate);

這樣就只調用pm.CsharpProgramer;一個方法了。

以上就是C#基礎知識整理 基礎知識(20) 委託(一)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.