Delegate, Method as Parameter.

  1. 代理, 將方法做爲另外一方法的參數. 相似C裏面的函數指針.
    using System;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greeting(string name);
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
            //委託,將方法做爲另外一方法的參數.委託能夠表明一系列返回值和參數類型與其一致的方法.
            private static void GreetingPeople(string name, Greeting greet)
            {
                greet (name);
            }
                
            public static void Main()
            {
                GreetingPeople ("Jeffrey Richter", GreetingEnglish);
                GreetingPeople ("劉德華", GreetingChinese);
                Console.ReadKey ();
            }
        }
    
    }
  2. 將方法綁定到委託
    using System;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greeting(string name);
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
            private static void GreetingFrance(string nom)
            {
                Console.WriteLine ("Bonjour,{0}", nom);
            }
            //delegate: use the Method name as Parameters.
            private static void GreetingPeople(string name, Greeting greet)
            {
                greet (name);
            }
                
            public static void Main()
            {
                GreetingPeople ("Jeffrey Richter", GreetingEnglish);
                GreetingPeople ("劉德華", GreetingChinese);
                //bind Method to Delegate
     Greeting chinese = GreetingChinese; Greeting english = GreetingEnglish; english += GreetingFrance;
                chinese ("許明會");
                english ("Matt Petrek");
                Console.ReadKey ();
            }
        }
    }
  3. 委託與接口
    using System;
    using System.Threading;
    
    namespace Demo
    {
        interface IGreeting{
            void Greeting(string name);
        };
    
        public class GreetingChinese:IGreeting
        {
            public void Greeting(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
        }    
        public class GreetingEnglish:IGreeting
        {
            public void Greeting(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
        }
        public class Demo
        {
            private static void Greeting(string name, IGreeting greeting)
            {
                greeting.Greeting (name);
            }
            public static void Main()
            {
                IGreeting chinese = new GreetingChinese ();
                IGreeting english = new GreetingEnglish ();
     chinese.Greeting ("許明會"); english.Greeting ("Jeffrey Richter"); Greeting ("Matt Petrik", english);
                Console.ReadKey ();
            }
        }
    }
  4. 更好的封裝,事件的由來
    using System;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greet(string name);
    
        public class GreetingManager
        {
            public Greet deleGreet;
            public void Greeting(string name, Greet greet)
            {
                greet (name);
            }
        }
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
    
            //Main()
            public static void Main()
            {
                GreetingManager gm = new GreetingManager ();
     gm.deleGreet = GreetingChinese; gm.deleGreet += GreetingEnglish ; gm.Greeting ("Matt Petrik",gm.deleGreet);
                Console.ReadKey ();
            }
        }
    }
  5. 更好的封裝,準備引入事件
    using System;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greet(string name);
    
        public class GreetingManager
        {
            public Greet deleGreet;
    
            public void Greeting(string name)
            {
                if (deleGreet!=null) {
                    deleGreet(name);
                }
            }
        }
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
    
            //Main()
            public static void Main()
            {
                GreetingManager gm = new GreetingManager ();
                gm.deleGreet = GreetingChinese;
                gm.deleGreet += GreetingEnglish ;
                gm.Greeting ("Matt Petrik");
                Console.ReadKey ();
            }
        }
    }
  6. 委託的目的是把它暴露到外面,以讓客戶端進行方法註冊。Event保證在類的內部老是Private,可認爲是爲Delegate定製的Property。
    using System;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greet(string name);
    
        public class GreetingManager
        {
            //public Greet deleGreet;
            public event Greet EventGreet;
    
            public void Greeting(string name)
            {
                if (EventGreet!=null) 
                    EventGreet(name);
            }
        }
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
    
            //Main()
            public static void Main()
            {
                GreetingManager gm = new GreetingManager ();
                gm.EventGreet += GreetingChinese;
                gm.EventGreet += GreetingEnglish ;
                //Greeting call from client, that's not good!
                gm.Greeting ("Matt Petrik");
                Console.ReadKey ();
            }
        }
    }
  7. .NET框架的委託和事件的
相關文章
相關標籤/搜索