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

C#中委托和事件的對比例子

編輯:C#入門知識

一:利用委托實現的例子:

    //定義一個委托類型
    public delegate void DoSthDelegate1();

    /// 
    ///  蘋果mp3播放器
    /// 
    class iPod
    {

        //在iPod類中定義一個委托變量
        public DoSthDelegate1 userDo;

        public void PlayMusic()
        {
            Console.WriteLine("開始播放音樂.....^^^^^^^^^^^^^^^^^^^^^^^^^........");
            if (userDo != null)
            {
                //當一開始播放音樂就觸發userDo()這個動作。  調用委托變量   而委托變量的具體賦值是在主程序中
                userDo();
            }
            Console.WriteLine("開始播放音樂.....#########################.........");
        }


        public void Stop()
        {
            Console.WriteLine("停止播放.");
            //userDo();
        }

        public void Next()
        {
            Console.WriteLine("播放下一首...");
        }
    }
主程序:

static void Main(string[] args)
        {

            #region 通過委托來實現的

            iPod pod = new iPod();
            pod.userDo = BlinkBackground;

            //調用音樂開始播放的方法。
            pod.PlayMusic();


            //可以隨意將之前用戶已經綁定的方法給覆蓋掉。
            //pod.userDo = ShowLrc;

            //明明沒有播放音樂,卻可以觸發userDo。  這裡就是冒充了發生  因此引入了事件
            //pod.userDo();   
            #endregion   

 	static void ShowLrc()
        {
            Console.WriteLine("今天是個好日子,.今天是個好日子,今天是個好日子,今天是個好日子,.........");
        }

        static void BlinkBackground()
        {
            Console.WriteLine("閃閃閃.....");
        }
	
	}


二:通過事件來實現

    //定義一個委托。
    public delegate void DoSthDelegate2();

    class iPod2
    {
        //定義了一個事件。
        //定義事件的時候必須通過委托,沒有委托就無法定義事件。
        public event DoSthDelegate2 MusicPlaying;

        public void PlayMusic()
        {
            Console.WriteLine("開始播放音樂.....^^^^^^^^^^^^^^^^^^^^^^^^^........");
            if (MusicPlaying != null)
            {
                //依然是在音樂開始播放的時候觸發了該動作。  調用事件變量
                MusicPlaying();
            }
            Console.WriteLine("開始播放音樂.....#########################.........");
        }


        public void Stop()
        {
            Console.WriteLine("停止播放.");

        }

        public void Next()
        {
            Console.WriteLine("播放下一首...");
        }
    }
主程序:

static void Main(string[] args)
        {

            #region 通過事件來實現的效果

            iPod2 pod2 = new iPod2();

            //事件不能用=直接賦值,也就避免了通過=將前面的所有內容直接覆蓋掉。
            pod2.MusicPlaying += new DoSthDelegate2(BlinkBackground);


            pod2.PlayMusic();

            //事件不能再類外部觸發,只能在類內部觸發
            //避免了向委托一樣,在外部冒充事件觸發。  這樣直接調用是不可能的
            // pod2.MusicPlaying();

            pod2.MusicPlaying += new DoSthDelegate2(pod2_MusicPlaying);   //添加事件
            pod2.MusicPlaying -= pod2_MusicPlaying;			//刪除事件
            #endregion

            Console.ReadKey();
        }

        static void pod2_MusicPlaying()
        {
            throw new NotImplementedException();
        }

        static void ShowLrc()
        {
            Console.WriteLine("今天是個好日子,.今天是個好日子,今天是個好日子,今天是個好日子,.........");
        }


        static void BlinkBackground()
        {
            Console.WriteLine("閃閃閃.....");
        }
    }

總結:

1.“委托”是一種數據類型,他可以存儲的是方法。

2.“事件”是一個對象,可以理解為對委托變量的封裝,事件的內部用的是委托實現的。

3.事件被編譯成為一個add_method()和remove_method()方法和一個私有的委托變量。

4.定義的事件變量不可以在所定義類的外部調用,防止了再外部冒充事件的觸發。

5.委托的作用其實是用來占位的,使用一個委托變量來代替方法的調用,在實際調用之前需要給委托變量賦值,否則為null。

6.事件的作用與委托一樣,只是在功能上比委托變量有更多的限制。



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