首頁  >  文章  >  後端開發  >  C#基礎知識整理 基礎知識(21) 委託(二)

C#基礎知識整理 基礎知識(21) 委託(二)

黄舟
黄舟原創
2017-02-11 14:05:551274瀏覽

看了前面一篇委託的用法中http://www.php.cn/,我們看到,

        public void Description(string programerName, DescriptionDelegate description)
        {
            description(programerName);
        }

這個方法時傳一個DescriptionDelegate description委託類型進來,那麼對於這個方法再做一下修改,能用起來方便一些,程式碼也更合理一些。把委託封裝起來,然後把不同語言的程式設計師描述方法提出來:
封裝:

    public class ProgramDescriptionDelegate2
    {
        public delegate void DescriptionDelegate(string programerName);

        public DescriptionDelegate myDelegate;

        public void Description(string programerName)
        {
            myDelegate(programerName);
        }
    }

提出的類別:

    public class TestDescriptionDelegate2
    {
        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语言编程!", programerName));
        }

        public void Test()
        {
            ProgramDescriptionDelegate2 pe = new ProgramDescriptionDelegate2();

            pe.myDelegate = CsharpProgramer;

            pe.myDelegate += CProgramer;

            pe.Description("SamYang");
        }
    }

這樣就比較合理一些,因為public void CsharpProgramer(string programerName)這些方法,應該是用戶可以隨時定義的,可以看做隨時變動的。而ProgramDescriptionDelegate2完全作為一個公共的類,它只負責執行綁定在委託上的方法。
呼叫:

            TestDescriptionDelegate2 t = new TestDescriptionDelegate2();

            t.Test();

輸出:

再回過來看ProgramDescriptionDelegate2類,public DescriptionDelegate myDelegate;應該是一個字段,根據面向對象的封裝性,字段要封裝為屬性。那麼在這裡封裝我們要使用一個很有用的字段event。
封裝如下:

   public class ProgramerDescriptionEvent
    {
        public delegate void DescriptionDelegate(string programerName);

        private event DescriptionDelegate myEvent;

        public event DescriptionDelegate MyEvent
        {
            add { this.myEvent += value; }

            remove { this.myEvent -= value; }
        }

        public void Description(string programerName)
        {
            myEvent(programerName);
        }
    }

 

  public class TestEvent
    {
        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语言编程!", programerName));
        }

        public void Test()
        {
            ProgramerDescriptionEvent pe = new ProgramerDescriptionEvent();

            pe.MyEvent += CsharpProgramer;

            pe.MyEvent += JavaProgramer;

            pe.Description("SamYang");//一般这个执行是放在引起事件执行的地方
        }
    }

調用:

            TestEvent te = new TestEvent();

            te.Test();

結果如下:

可以看出,什麼是事件,其實本質使用的是委託,但是使用了event是這種委託變成了一種機制,叫事件。
那麼看msdn對委託和事件的描述:
事件是物件發送訊息,以發訊號通知操作的發生,操作可能是由使用者互動(滑鼠、鍵盤操作等)引起的,或是由某些其他的程式邏輯觸發。捕捉事件並對其作出回應的物件叫做事件接收方。
在事件通訊中,事件發送方類別不知道哪個物件或方法會接收到它引發的事件。所需要的是在來源和接收方之間存在一個媒介。 .NET Framework 定義了一個特殊的型別 (Delegate),該型別提供函數指標的功能。委託是可保存對方法的參考的類別。與其他的類別不同,委託類別具有一個簽名,並且它只能對與其簽名匹配的方法進行引用。這樣,委託就等效於一個型別安全函數指標或一個回呼。雖然委託具有許多其他的用途,但這裡只討論委託的事件處理功能。一個委託聲明足以定義一個委託類別。聲明提供委託的簽名,公共語言運行庫提供實作。例如:
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
delegate 關鍵字通知編譯器 AlarmEventHandler 是一個委託類型。依照約定,.NET Framework 中的事件委託有兩個參數:引發事件的來源和該事件的資料。即sender和e。

以上就是C#基礎知識整理 基礎知識(21) 委託(二)的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn