C#委托和事件的簡單實例


委托

C#里這個委托我的理解是可以看成是一個方法模板的類型。(不過並沒有找到相關的理解
比如有幾個返回值,參數列表類型相同的方法,就能用同個模板類型來表示,然后實例化一個委托類型就綁定上一個或多個方法,然后就可以一次調用這多個方法,相當於把方法對象化?。

using System;
namespace test { 
    class Test{
        static void fun1(int a) {
            Console.WriteLine("fun one {0}",a);
        }
        static void fun2(int a)
        {
            Console.WriteLine("fun two {0}", a);
        }
        static void fun3(int a)
        {
            Console.WriteLine("fun three {0}", a);
        }
        
        //定義一個委托類型
        public delegate void fun(int b);
        static void Main(string[] args)
        {
            fun a, b, c, d,e;
            //綁定方法
            a = fun1;
            b = fun2;
            c = fun3;
            d = fun1;
            d += fun2;
            d += fun3;
            e = new fun(fun1);
            //調用方法
            a(1);
            b(2);
            c(3);
            d(4);
            d -= fun2;
            d(4);
            e(2);
            Console.ReadKey();
        }
    }
}

事件

事件需要用到委托,或者說是一種特殊的委托。
事件比起委托其實就多了一個關鍵字event,起到一個對委托的保護作用,有了event,外部就無法直接去調用發布者內部的委托,因為這是不合理的,發布者何時發布這個委托函數應該是發布者自己決定的。

using System;
namespace test {
    /***********發布器類***********/
    public class EventTest
    {
        public delegate void NumManipulationHandler(); //聲明委托
        public NumManipulationHandler ChangeNum; //聲明事件

        public void OpenDoor()
        {
            ChangeNum();  //事件觸發
        }
    }

    /***********訂閱器類***********/
    public class subscribEvent
    {
        public void printf()
        {
            Console.WriteLine("The door is opened.");
        }
    }

    /***********觸發***********/
    public class MainClass
    {
        public static void Main()
        {
            EventTest e = new EventTest(); /* 實例化事件觸發對象 */
            subscribEvent v = new subscribEvent(); /* 實例化訂閱事件對象 */

            /* 訂閱器的printf()在事件觸發對象中注冊到委托事件中 */
            e.ChangeNum += new EventTest.NumManipulationHandler(v.printf);
            e.OpenDoor(); /* 觸發了事件 */
            e.ChangeNum();
            Console.ReadKey();
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM