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

來源:互聯網
上載者:User
看了前面一篇委託的用法中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) 委託(二)的內容,更多相關內容請關注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.