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框架的委托和事件

Delegate, Method as Parameter.的更多相关文章

  1. 重构7-Rename(method,class,parameter)

    这是我最常用也是最有用的重构之一.我们对方法/类/参数的命名往往不那么合适,以至于误导阅读者对于方法/类/参数功能的理解.这会造成阅读者的主观臆断,甚至引入bug.这个重构看起来简单,但却十分重要. ...

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

    A delegate is a type that safely encapsulates a method, similar to a function pointer in C and C++. ...

  3. C# Control.BeginInvoke、synchronizationcontext.post、delegate.BeginInvoke的运行原理

    背景 用到的知识点 1.windows消息机制 备注:鼠标点击.键盘等事件产生的消息要放入系统消息队列,然后再分配到应用程序线程消息队列.软件PostMessage的消息直接进入应用程序线程消息队列, ...

  4. iOS 之美:iOS Delegate 使用五步曲

    在iOS 开发中, 搞清楚Delegate 是需要花些时间的. Delegate 本来是软件架构设计的一种理念.对于像手机这样一个有限的设备,我们需要充分考虑到:内存要尽量省着用: 视图之间的关系要清 ...

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

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }

    转自:http://www.cnblogs.com/xiaofei59/archive/2010/11/25/1887285.html 异常{ 无法将 匿名方法 转换为类型“System.Delega ...

  7. 委托 delegate, 继承

    c# 的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了嘛.对不对!怎么录嘛! 一个函数,如果它的参数是函数,那么是这样子写的 public void method( ...

  8. jQuery事件绑定方法bind、 live、delegate和on的区别

    我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 1.准备知识 当我们在开始的时候,有些知识是必须具备的: 1 ...

  9. 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }

    异常{ 无法将 匿名方法 转换为类型"System.Delegate",因为它不是委托类型 } 委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数  查看如下代 ...

随机推荐

  1. php mb_convert_encoding的使用

    mb_convert_encoding( $str, $encoding1,$encoding2 ): $str,要转换编码的字符串 $encoding1,目标编码,如utf-8,gbk,大小写均可 ...

  2. VMware Player安装Debian系统

    尝试用虚拟机来安装Debian系统,感觉这样一来安装与卸载方便,二来也可以在Linux系统安装出现问题的情况下方便在host主机上查找解决方法,同时也避免了要重新设置分区来安装Linux系统(双系统的 ...

  3. 怎样彻底清楚Chrome缓存数据

    如下图所示: 1.鼠标放在刷新那然后点击右键 2.点击Empty Cache and Hard Reload (注意:一定要在点击F12的模式下)

  4. Python 之简易单链表

    单链表的基本要素有 2 个,数据项和连接项.这两项在 Python 中可以通过对象及其属性来实现. class Node: def __init__ (self, data): self.data = ...

  5. kbengine里如何使用git快速下载项目?

    项目有两个镜像,github[https://github.com/kbengine/kbengine.git] ,osc开源中国[https://git.oschina.net/likecg/kbe ...

  6. etcd第一集

    网站:https://github.com/coreos/etcd 一些观点:https://yq.aliyun.com/articles/11035 1.etcd是键值存储仓库,配置共享和服务发现2 ...

  7. 在 anyproxy 上做 mock 和 fuzz 测试

    引言 写这个工具,主要有几个原因: 最近老大在尝试不同视角的测试----健壮性测试,任务下来,所以挽起袖子就开撸了 app很可能因为后端api做了变更,返回了一个异常的值而出现难以预知的问题,健壮性受 ...

  8. 浏览器下载/导出文件 及jQuery表单提交

    1 比如以下按钮, 用于导出文件,如EXCEL文件. <li> <button class="whiteBg btn2" onclick="doExp( ...

  9. [git]问题list

    1. fast-forward和non fast-forward分别代表什么概念? 2. 在git中文件index是个什么概念? 3. stage/index/cache三者有什么关系? 4. git ...

  10. 找不到方法:“Boolean System.Runtime.Serialization.DataContractAttribute.get_IsReference()”的解决办法

    找不到方法:“Boolean System.Runtime.Serialization.DataContractAttribute.get_IsReference()”.的解决办法站点发布后部署到了两 ...