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框架的委托和事件
时间: 2025-01-13 11:16:45

Delegate, Method as Parameter.的相关文章

c# 关键字delegate、event(委托与事件)[MSDN原文摘录][1]

A delegate is a type that safely encapsulates a method, similar to a function pointer in C and C++. Unlike C function pointers, delegates are object-oriented, type safe, and secure. The type of a delegate is defined by the name of the delegate. The f

C# 自己对delegate的总结和认识

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace LamdaSimple { public partial cla

Java Method Overriding --- runtime polymorphism ! not overloading

ref: http://www.studytonight.com/java/method-overriding-in-java.php                     Method Overriding between parent and child The key benefit of overriding is the ability to define method that's specific to a particular subclass type class Anima

Swift入门教程18-代理Delegate

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc 一 代理的理解 何为代理?顾名思义,代理就是把自己做的任务交给别人做.让代理遵循着监听到一些事件,实现一些数据源.做过IOS开发的都应该知道TableView有两个属性,delegate和dataSource.这就是代理最好的体现,tableView在设计之初并不知道这个tableView将来会放在哪里,存储的是什么东西,这里数据源就起到了关键性作用:对于设计者来说,我只要依据数据源来生成对应的视图,对于

委托 delegate

c# 的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了嘛.对不对!怎么录嘛! 一个函数,如果它的参数是函数,那么是这样子写的 public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod) Action<string, Int32> voidMethod 的意思是说这个将被传进来的函数是一个没有return的函数,就是publ

C#匿名方法与Delegate类型转换错误

问题描述 C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法: 0 public object Invoke(Delegate method); 1 public IAsyncResult BeginInvoke(Delegate method); 在这种情况下, 如果不使用匿名方法, 则

利用delegate来解决类之间相互引用问题(引用死锁)

类之间相互引用--类A中需要调用类B中的方法,同时,类B中又要调用类A中的方法.(也被称为引用死锁,通常会出现编译错误). 解决方法是,在类A中引用类B,并使类A成为类B的delegate,这样在类A中就可以调用类B中的方法,而在类B中可以设一个delegate属性,(这个delegate其实就是类A)就可以用[delegate msg]的方式来调用类A中的方法了. 具体实现如下: ** classA.h : @interface ClassA<ClassBDelegate> { ClassB

.bind()-.live()-.delegate()-.on()

jQuery中的bind(),live(),on(),delegate() 当我们给DOM元素上绑定一些事件的时候,常见的方法就是上边几种了,那么它们之间有什么区别呢? 总结: ·用.bind()的代价是非常大的,它会把相同的一个事件处理程序hook到所有匹配的DOM元素上 .不要再用.live()了,它已经不再被推荐了,而且还有许多问题 .delegate()会提供很好的方法来提高效率,同时我们可以添加一事件处理方法到动态添加的元素上 ·我们可以用.on()来代替上述的3种方法 Event b

iOS 之美:iOS Delegate 使用五步曲

在iOS 开发中, 搞清楚Delegate 是需要花些时间的. Delegate 本来是软件架构设计的一种理念.对于像手机这样一个有限的设备,我们需要充分考虑到:内存要尽量省着用: 视图之间的关系要清晰. 如果你所开发的App ,仅仅是一个demo,是体现不出架构优势的. 但当你的App 需要处理海量数据, 而视图之间的关系又颇为复杂时,你将不得不考虑这些问题.视图之间的关系,不仅仅是跳转,更重要的是视图之间数据的传递.当视图A 发生变化时,如何将这个变化告知视图B 呢? 举个例子吧. 如下图所