Delegate, Method as Parameter.
- 代理, 将方法作为另一方法的参数. 类似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 ();
}
} } - 将方法绑定到委托
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 ();
}
}
} - 委托与接口
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 ();
}
}
} - 更好的封装,事件的由来
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 ();
}
}
} - 更好的封装,准备引入事件
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 ();
}
}
} - 委托的目的是把它暴露到外面,以让客户端进行方法注册。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 ();
}
}
} - .NET框架的委托和事件
的
Delegate, Method as Parameter.的更多相关文章
- 重构7-Rename(method,class,parameter)
这是我最常用也是最有用的重构之一.我们对方法/类/参数的命名往往不那么合适,以至于误导阅读者对于方法/类/参数功能的理解.这会造成阅读者的主观臆断,甚至引入bug.这个重构看起来简单,但却十分重要. ...
- c# 关键字delegate、event(委托与事件)[MSDN原文摘录][1]
A delegate is a type that safely encapsulates a method, similar to a function pointer in C and C++. ...
- C# Control.BeginInvoke、synchronizationcontext.post、delegate.BeginInvoke的运行原理
背景 用到的知识点 1.windows消息机制 备注:鼠标点击.键盘等事件产生的消息要放入系统消息队列,然后再分配到应用程序线程消息队列.软件PostMessage的消息直接进入应用程序线程消息队列, ...
- iOS 之美:iOS Delegate 使用五步曲
在iOS 开发中, 搞清楚Delegate 是需要花些时间的. Delegate 本来是软件架构设计的一种理念.对于像手机这样一个有限的设备,我们需要充分考虑到:内存要尽量省着用: 视图之间的关系要清 ...
- C# 自己对delegate的总结和认识
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
转自:http://www.cnblogs.com/xiaofei59/archive/2010/11/25/1887285.html 异常{ 无法将 匿名方法 转换为类型“System.Delega ...
- 委托 delegate, 继承
c# 的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了嘛.对不对!怎么录嘛! 一个函数,如果它的参数是函数,那么是这样子写的 public void method( ...
- jQuery事件绑定方法bind、 live、delegate和on的区别
我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 1.准备知识 当我们在开始的时候,有些知识是必须具备的: 1 ...
- 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
异常{ 无法将 匿名方法 转换为类型"System.Delegate",因为它不是委托类型 } 委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数 查看如下代 ...
随机推荐
- java 环境配置 及java 历史
知识点概括:1 Java 的历史 2 JDK 的配置 3 文件的编译与执行 ...
- jsonp解决跨域
ajax请求: $.ajax({ type: "get",//必须使用get方式 async: false, url: "htt ...
- Postfix邮件服务器搭建及配置
一.邮件服务器(Mail Server)的传输协议 1.简单邮件传输协议(SMTP):Simple Mail Transger Protocol 2.扩展的简单邮件传输协议(ESMTP):Extend ...
- 《C与指针》读后感
到目前为止,我已经读到了<C与指针>第十六章,总共十八章,接下来的章节内容分别是标准函数库.数据结构.以及C语言的运行环境,还没有完全做完练习就写这篇读后感原因有二,第一个当然是最主要的, ...
- AJAX 状态值(readyState)与状态码(status)详解
总结:status体现的是服务器对请求的反馈,而readystate表明客户端与客户的交互状态过程. 1- AJAX状态值与状态码区别AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成 ...
- jsonp案例
<button id="btn">click</button><script type="text/javascript"> ...
- 副本限制修改-M端
魔兽的副本很多,也有很多副本都有进入的限制,比方说最普遍的,有些副本有级别限制,没达到要求的级别是不能进入对应副本的还有些副本是有任务需求限制,比方说黑翼副本,需要做完一个任务之后才可以进入副本当然, ...
- 观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 抽象主题(Subject):它把所有观察者对 ...
- 用word制作电子书最简捷模式 支持epub和mobi目录
因为制作一本OCR的电子书,转到word编辑排版后,用calibre转成mobi发现没有目录,在网上查了资料研究了一下,终于解决了目录问题,根本不用将word文档转换为什么htm或txt,尤其是转换t ...
- 数据库服务器CPU持续百分之百、部分Session一直处于执行状态---等待事件为:asynch descriptor resize(Oracle Bug )
问题描述: 项目反馈数据库服务器的CPU持续100%的情况,跟踪发现很多活动会话的等待事件是“asynch descriptor resize”,并且这些会话一直处于Active状态,而这些会话执行的 ...