1.委托的定义

委托可以看成是一种数据类型,可以用于定义变量能接受的值只能是一个方法。

委托简单的示例:

namespace DelegateDemo
{
class Program
{
public delegate int MathOptDelegate(int value1,int value2);
public int add(int value1, int value2)
{
return value1 + value2;
} static void Main(string[] args)
{
MathOptDelegate mod;
Program p = new Program();
mod =p.add;
Console.WriteLine(mod(,));
Console.ReadKey();
}
}
}

利用委托的构造函数创建委托

namespace DelegateDemo
{
class Program
{
public delegate int MathOptDelegate(int value1,int value2);
public int add(int value1, int value2)
{
return value1 + value2;
} static void Main(string[] args)
{ Program p = new Program();
MathOptDelegate mod = new MathOptDelegate(p.add);
Console.WriteLine(mod(,));
Console.ReadKey();
}
}
}

从这个示例中可以得出这样的直观印象:

委托可以堪称是一个方法的容器,将某一个具体的方法装入后,就可以把它当成方法一样使用。

2.委托的调用列表

从上一个例子看,委托变量可以引用某一个方法,调用它就相当于调用这个方法。

如果委托今年仅是方法调用的另一种形式,那何必多此一举引入委托这一特性?直接调用方法不是更简单明了?

因为委托变量不仅可以引用另一个方法,还可以组合多的方法并批量执行它们。

namespace DelegateDemo2
{
class Program
{
public delegate void MyDelegate(String str);
public static void hello(String str)
{
Console.WriteLine(str+"你好");
}
public static void goodbye(String str)
{
Console.WriteLine(str+"再见");
}
static void Main(string[] args)
{
MyDelegate a,b,c,d;
a = Program.hello;
a("a");
b = Program.goodbye;
b("b");
c = a + b;//等价将两个方法体合并
c("c");// c你好 c再见
d = c - a;
d("d");//d再见
Console.ReadKey(); }
}
}

像C这样的委托变量可称为多路委托变量。

可以用加法运算符来组合单个委托变量为多路委托变量。类似的,也可以使用减法运算符来从一个多路委托变量中移除某个委托变量。

namespace DelegateDemo2
{
class Program
{
public delegate void MyDelegate(String str);
public static void hello(String str)
{
Console.WriteLine(str+"你好");
}
public static void goodbye(String str)
{
Console.WriteLine(str+"再见");
}
static void Main(string[] args)
{
MyDelegate a,b,c,d;
a = Program.hello;
a("a");
b = Program.goodbye;
b("b");
c = a + b;//等价将两个方法体合并
c("c");// c你好 c再见
d = c - a;
d("d");//d再见
Delegate[] ds;
ds = c.GetInvocationList();
foreach(Delegate s in ds)
{
Console.WriteLine(s);
//DelegateDemo2.Program+MyDelegate
//DelegateDemo2.Program+MyDelegate
}
Console.WriteLine(ds.Length);
Console.ReadKey(); }
}
}

如果委托定义的方法有返回值,则多路委托变量的返回值为委托调用列表中最后一个方法的返回值,中间调用的方法返回值会被丢弃。

使用泛型委托:

Func系列委托

以下是Func熄了委托的定义,依其泛型类型参数的多少有多个重载形式:

public delegate TResult Func<Tresult>();

public delegate TResult Func<T,Tresult>();

基于C#委托的深入分析的更多相关文章

  1. C# 基于委托的事件

    事件基于多播委托的特性. 多播委托事实上就是一组类型安全的函数指针管理器,调用则执行顺序跳转到数组里所有的函数指针里执行. class Program { public class CarInfoEv ...

  2. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  3. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  4. [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...

  5. .Net Framework中的标准委托和事件_1

    .Net Framework中的标准委托,已经定义在命名空间System中, namespace System { public delegate void EventHandler(object s ...

  6. c#中委托和事件(续)(转)

    本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为 ...

  7. C# 委托总结

    总结 委托的本质: 委托是一种特殊的数据类型,它表示某种特定类型的函数,并且可以表示多个函数,将这些函数串联起来.使用委托就好像函数调用一样. 委托实质上是一个类,编译器会根据关键字delegate自 ...

  8. 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    第一章.C#委托和事件(Delegate.Event.EventHandler.EventArgs) 分类: 学习笔记-C#网络编程2012-12-08 14:10 7417人阅读 评论(3) 收藏  ...

  9. C#委托(Delegate)学习日记

    在.NET平台下,委托类型用来定义和响应应用程序中的回调.事实上,.NET委托类型是一个类型安全的对象,指向可以以后调用的其他方法.和传统的C++函数指针不同,.NET委托是内置支持多路广播和异步方法 ...

随机推荐

  1. poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)

    #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #includ ...

  2. 用kaptcha生成验证码

    1.新建web项目,导入jar包:kaptcha-2.3.jar 2.配置web.xml代码如下: <?xml version="1.0" encoding="UT ...

  3. hdu2588 GCD 给定n,m。求x属于[1,n]。有多少个x满足gcd(x,n)>=m; 容斥或者欧拉函数

    GCD Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Sub ...

  4. error: not found: value sc

    [问题] 解压spark的tar包后,执行bin/spark-shell,执行val lines=sc.textFile("README.md")时,抛错error: not fo ...

  5. Windows中搭建ftp服务器

    使用工具Quick Easy FTP Server Windows中搭建FTP服务器有什么用呢? 确实没有用,直到有一次,我在VM中安装了Linux虚拟机,但是文件怎么也上传不到这个虚拟机中. 然后用 ...

  6. SQLServer -- 竟然默认不区分大小写

    SELECT * FROM USER_INFO WHERE USERNAME = :username; 这样的写法,:username的值竟然不区分大小写 原因:数据库的排序规则设置的是Chinese ...

  7. oracle怎么卸载

    Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.到目前仍在数据库市场上占有主要份额.劳伦斯·埃里森和他的朋友,之前的同事Bob ...

  8. il code swtich

    public enum RangeItemType { CompanyPicker = 1, //公司STR_COMPANY BrDivPicker = 2, //分行STR_BRDIV Depart ...

  9. ssl 生成证书

    使用OpenSSL生成证书 1.生成RSA密钥的方法 openssl genrsa -des3 -out privkey.pem 2048 这个命令会生成一个2048位的密钥,同时有一个des3方法加 ...

  10. MySQL的语法高级之SELECT

    1.语法:select 字段列表 from  子句 [where 子句][group by 子句][ order by 子句][having 子句][limit 子句]; 注解: 1.where子句对 ...