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

事件,時間

編輯:C#入門知識

事件,時間


1. 多播委托

    多播委托就是一個方法列表:+=在列表尾巴上加方法;-=就是從尾巴開始匹配,

    只移除第一個完全吻合額方法,如果沒有吻合,不報錯。

class MultiDelegateShow 
    {
        public void MultiDelegateExample()
        {
            //多播委托就是一個方法列表:+=在列表尾巴上加方法;-=就是從尾巴開始匹配,
            //只移除第一個完全吻合額方法,如果沒有吻合,不報錯。

            OtherClass otherclass = new OtherClass();

            Console.WriteLine("*****************************+=添加方法列表********************************");
            Action del1 = new Action(this.SameClassMethod); //加入1. 同類中的方法
            del1 += new OtherClass().OtherClassMethod; //加入 2. 不同類的實例方法
            del1 += OtherClass.StaticMethod;//加入3.靜態方法
            del1 += () => Console.WriteLine("LambdaMethod is be calling"); //加入4.lambda表達式
            del1 += otherclass.OtherClassMethod;//加入5. 注意和2的區別
            del1.Invoke();  //程序會按照1,2,3,4調用方法

            Console.WriteLine("*****************************-=刪除方法列表********************************");
            del1 -= this.SameClassMethod; //從尾巴開始查找(4,3,2,1),匹配到刪除
            del1 -= OtherClass.StaticMethod; // 靜態方法刪除
            del1-= new OtherClass().OtherClassMethod;//這裡刪除不了,因為是不同實例的方法
            del1 -= () => Console.WriteLine("LambdaMethod is be calling");//Lambda方法是無法移除的
            del1 -= otherclass.OtherClassMethod;//這是同一個實例方法,被移除
            del1.Invoke();

            Console.WriteLine("***************************帶有返回值的多播委托******************************");
            Func<string> del2 = new Func<string>(otherclass.WithReturnMethod);
            del2 += () => "1";
            del2 += () => "2";
            del2 += () => "3";
            del2 += () => "4";
            Console.WriteLine(del2.Invoke());      //帶返回值的多播委托,只能獲得最後一個方法的返回值

            Console.WriteLine("*****************************多播委托的異步調用********************************");
            //del1.BeginInvoke(null, null); 多播委托不能直接異步調用
            foreach (Action item in del1.GetInvocationList()) //這裡相當於為每一個委托開一個線程
            {
                item.BeginInvoke(null, null);
            }
        }

        private void SameClassMethod()   
        {
            Console.WriteLine(" SameClassMethod is be calling");
        }
    }
    
    class OtherClass
    {
        public void OtherClassMethod()
        {
            Console.WriteLine("OtherClassMethod is be calling");
        }

        public static void StaticMethod()
        {
            Console.WriteLine("StaticMethod is be calling");
        }

        public string WithReturnMethod()
        {
            return string.Format("This is a method with a string return");
        }
    }

 

2. 委托的意義:解耦

                        異步多線程

                        多播委托

 

 

3. 事件

   事件就是委托的實例,加了一個Event關鍵字

   委托是一種類型,事件是委托的實例

   加Event關鍵字後,控制了權限,不讓外部調用或直接賦值   

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*****************************EventShow********************************");
            EventShow eventshow = new EventShow() ;

            //Action catdelegate = Dog.Run; 委托可以直接賦值
            //catdelegate.Invoke(); 委托可以直接調用
            //catdelegate = null; 委托可以賦值null
            //eventshow.catEventhandle = Dog.Run;  事件不可以直接賦值
            //eventshow .catEventhandle.Invoke();  事件不讓外部直接調用
            //事件控制了權限,事件只能出現在+=,-=的左邊
            eventshow.catEventhandle += Dog.Run;
            eventshow.catEventhandle += Baby.Cry;
            eventshow.catEventhandle += Father.Turn;
            eventshow.catEventhandle += Mother.Hug;
            eventshow.CatMiao();
            Console.ReadKey();
        }

 

    class EventShow
    { 
        public event Action catEventhandle=null;
        public void CatMiao()
        {
            Console.WriteLine("cat Miao");
            if(catEventhandle!=null)
            {
                catEventhandle.Invoke();
            }
        }
    }
    class Dog
    {
        public static void Run()
        {
            Console.WriteLine("Dog Run");
        }
    }

 

 

 

    

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