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. 激活modelsim se 10.4 时运行patch_dll.bat不能生成TXT

    问题描述: 激活modelsim时运行patch_dll.bat总是在DOS界面一闪而过,不能生成LICENSE.TXT 问题解决: 先取消文件 mgls64.dll 的只读属性(这句话在README ...

  2. Skyscrapers Aren’t Scalable

     Skyscrapers Aren't Scalable Michael Nygard WE oFTEn HEAR SoFTWARE EnginEERing CoMpAREd to building ...

  3. js使用正则表达式验证身份证格式

    function checkIdentity(identity){ var reg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/; i ...

  4. centos IP 配置 和 克隆的centos解决上网问题

    1. vi /etc/sysconfig/network-scripts/ifcfg-eth0 2. DEVICE=eth1HWADDR=00:0C:29:D2:9A:F5TYPE=EthernetU ...

  5. Nodejs各种功能Module的收集整理

    收集整理接触过的各种常用的nodejs modules,不断更新~~~ ================================================================ ...

  6. POJ 1815 Friendship(最小割)

    http://poj.org/problem? id=1815 Friendship Time Limit: 2000MS   Memory Limit: 20000K Total Submissio ...

  7. ApiDoc 和 Swagger 接口文档

    ApiDoc:https://blog.csdn.net/weixin_38682852/article/details/78812244 Swagger git: https://github.co ...

  8. 不通过AppStore,在iOS设备上直接安装应用程序的原理

    本文转载至  http://mobile.51cto.com/hot-439095.htm 通过itms-services协议,可以通过safari浏览器直接在iOS设备上安装应用程序.利用这种方式, ...

  9. jqgrid 事件说明

    Events(事件) 事件响应动作被设置为表格的属性,以下定义了行被选中时的响应: var lastSel; jQuery("#gridid").jqGrid({ ...    o ...

  10. hfut 1287

    http://acm.hfut.edu.cn/OnlineJudge/ 中文题. 区间线段树,需要剪枝.n的大小有问题. #include <iostream> #include < ...