委托[delegate]_C#
委托(delegate):
委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果您有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。
下面看一段代码:
using System ;
delegate void EatDelegate(string food);
class MyDelegate
{
static void zsEat(string food)
{
Console .WriteLine ("张三吃"+food);
}
static void lsEat(string food)
{
Console .WriteLine ("李四吃"+food);
}
static void wwEat(string food)
{
Console .WriteLine ("王五吃"+food);
}
static void Main()
{
EatDelegate zs=new EatDelegate (zsEat ); //C#2.0语法:
EatDelegate zs=zsEat ;
EatDelegate ls=new EatDelegate (lsEat );
EatDelegate ww=new EatDelegate (wwEat );
EatDelegate eatChain=null;
Console .WriteLine ("座谈会开始");
eatChain = zs+ls+ww;
eatChain ("西瓜");
Console .WriteLine ("李四出去接电话");
eatChain -=ls;
eatChain ("香蕉");
Console .WriteLine ("李四回来了");
eatChain +=ls;
eatChain ("桔子");
//下面是匿名方法¨
eatChain += delegate(string food) {Console .WriteLine ("我吃"+food); };
eatChain += delegate(string food) {Console .WriteLine ("你吃"+food); };
eatChain += delegate(string food) {Console .WriteLine ("他吃"+food); };
eatChain ("饭");
}
}
下面是实例方法的一段代码:
using System ;
delegate void EatDelegate(string food);
class Man
{
private string name;
public Man(string name)
{
this .name =name ;
}
public void eat(string food)
{
Console .WriteLine (name+"吃"+food);
}
}
class Party
{
static void Main()
{
Man ZS=new Man ("张三");
Man LS=new Man ("李四");
Man WW=new Man ("王五");
EatDelegate zs=new EatDelegate (ZS.eat );
EatDelegate ls=new EatDelegate (LS.eat );
EatDelegate ww=new EatDelegate (WW.eat );
EatDelegate eatChain=null;
Console .WriteLine ("座谈会开始");
eatChain = zs+ls+ww;
eatChain ("西瓜");
Console .WriteLine ("李四出去接电话");
eatChain -=ls;
eatChain ("香蕉");
Console .WriteLine ("李四回来了");
eatChain +=ls;
eatChain ("桔子");
}
}
委托可作为方法的参数进行动态调用,看下面代码:
using System ;
delegate void EatDelegate(string food);
class Man
{
private string name;
public Man(string name)
{
this .name =name ;
}
public void eat(string food)
{
Console .WriteLine (name+"吃"+food);
}
}
class Party
{
static void eatTogether(string food,params EatDelegate [] values)
{
if (values ==null )
{
Console .WriteLine ("座谈会结束");
}
else
{
EatDelegate eatChain=null ;
foreach (EatDelegate ed in values )
eatChain +=ed;
eatChain (food);
Console .WriteLine ();
}
}
static void Main()
{
Man ZS=new Man ("张三");
Man LS=new Man ("李四");
Man WW=new Man ("王五");
EatDelegate zs=new EatDelegate (ZS.eat );
EatDelegate ls=new EatDelegate (LS.eat );
EatDelegate ww=new EatDelegate (WW.eat );
Console .WriteLine ("座谈会开始");
eatTogether("西瓜",zs,ls,ww);
Console .WriteLine ("李四出去接电话");
eatTogether("香蕉",zs,ww);
Console .WriteLine ("李四回来了");
eatTogether("桔子",zs,ls,ww);
Console .WriteLine ("座谈会结束");
eatTogether (null ,null );
}
}
委托[delegate]_C#的更多相关文章
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- C# 委托Delegate(一) 基础介绍&用法
本文是根据书本&网络 前人总结的. 1. 前言 定义&介绍: 委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的 ...
- 为什么不能把委托(delegate)放在一个接口(interface)当中?
stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...
- C# 代理/委托 Delegate
本文转载自努力,努力,努力 1. 委托的定义:委托是函数的封装,它代表一"类"函数.他们都符合一定的签名:拥有相同的参数列表,返回值类型.同时,委托也可以看成是对函数的抽象,是函数 ...
- c# 委托 delegate
委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...
- 理解委托(delegate)及为什么要使用委托
理解委托(delegate)及为什么要使用委托 委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来 ...
- 深入理解委托(Delegate)
前言 委托其实一直以来都感觉自己应该挺熟悉的,直到最近又去翻了翻 CLR via C#,感觉我之前的理解可能还有失偏颇.在这记录一下. 之前文章的链接: 接口和委托的泛型可变性 C#高级编程笔记 De ...
- C# -- 使用委托 delegate 执行异步操作
C# -- 使用委托 delegate 执行异步操作 委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似. 与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的. 委托的 ...
随机推荐
- 解决ArcGIS Engine AE 读取shapefile中文属性乱码的一条偏方
最近写一个程序,AE+C#,读shp字段属性,其中读到中文就乱码了 这个问题比较奇怪,用AE很多年了,怎么突然就乱码呢,用Arcmap打开,没乱码,证明不是数据问题 网上搜搜,很多人说是许可初始化的问 ...
- JQuery的Ajax使用Get,Post方法调用C#WebService并返回数据
本文将介绍jQuery调用基于.NET Framework 3.5的WebService返回JSON数据,另外还要介绍一下用jQuery调用WebService的参数设置及设置不当所出现的问题,还有出 ...
- Ping批量函数
function pingm ($file){ $ips = gc $file foreach ($ip in $ips) { $cmdline +="ping " + $ip + ...
- AndroidEventBus ( 事件总线 ) 的设计与实现
1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,非常大程度上减少了它们之间的耦 ...
- ORACLE 11G用于有效期
Oracle报错,ORA-28001: 口令已经失效(转自网络) 错误信息:ORA-28001: the password has expired解决方法 Oracle11G创建用户时缺省passwo ...
- Apache Solr采用Java开发、基于Lucene的全文搜索服务器
http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...
- SAP BW 通过视图创建数据源(无单位)
因业务明细表中数量没有单位,所以BW创建数据源时,需做增强 数据表: ZDB_H(抬头) ZDB_I(明细) ECC 系统中: 1.创建视图ZVDBWQ,因明细表中数量没有单位,所以创建视图时不包括数 ...
- mysqldump的流程
发布时间:2013 年 4 月 6 日 发布者: OurMySQL 来源:P.Linux Laboratory 前几天看到群里在讨论mysqldump导致锁表的问题,为什么一个表已经dump ...
- [原 -> 砖] C# IEnumerable<T>泛型取值
为什么要写这个?因为发现,很多人在读取泛型集合中Item的值时,使用的方法是 item.GetType().GetField("xxxxx").GetValue() 或类似的写法. ...
- python工具程序一、复制目录中指定扩展名的文件
#!/usr/bin/env python # coding:utf-8 # xcopy Lib directory and rename all files to *d.lib import os ...