粗看C#委托
C#的好多定义跟C艹不太相同,先来分析一下“委托”。
1. 委托的定义:
委托,可以认为是类型安全的函数指针,类型安全就是指明确定义了返回类型与参数类型,在C#代码编译时就能够确保指针传参时的安全性。
值得注意的是,委托也是一种类,在普遍的定义中,“类”表示广泛的定义,泛指一类事物,而对象则表示”类的实例”。但是委托只有一个术语,既表示“类”,也表示”实例”。
委托类的定义主要是定义它函数指针的返回值、参数类型。委托类的实例化,则是将符合委托类定义的具体函数指针交给一个实例。
2. 委托的用法:
简单的用法不加赘述,把它理解成类型安全的函数指针后就容易多了。
简单的提示则是:
public delegate string GetString();
int x = 10;
GetString testmethod = new GetString(x.ToString);
x.ToString 代表的才是函数指针,而不是 x.ToString(),它代表的只是 string 类型的返回值。
3. Action<T>与Func<T>:
在C#代码阅读中,经常发现Action<T>与Func<T>的用法。
Action<T>:这类委托表示引用一个返回类型为void的方法。例如,Action<in T1, in T2> 表示调用带2个参数的方法。
Func<T>:这类委托表示引用一个带返回类型的方法。例如,Func<in T1, out T> 表示带一个参数且有返回类型的方法,out 永远放在最后一位。
使用Action<T>与Func<T>可以一句话就包含了委托类型的定义与实例化:
class MathOperation
{
public static double MultiplyByTwo(double value)
{
var res = value * 2;
Console.WriteLine("MultiplyByTwo:{0}.", res);
return res;
} public static void ProcessAndDisplay(Func<double, double> action, double value)
{
Console.WriteLine();
Console.WriteLine("ProcessAndDisplay called with value = {0}.", value);
double res = action(value);
}
} class Program
{
static void Main(string[] args)
{
Func<double, double> MathOperations = MathOperation.MultiplyByTwo; MathOperation.ProcessAndDisplay(MathOperations, 2);
Console.ReadLine();
}
}
Func<double, double> MathOperations = MathOperation.MultiplyByTwo;
在这里就无需先 delegate double MathOperations(double value) 的声明了。
4. 多播委托
class MathOperation
{
public static double MultiplyByTwo(double value)
{
var res = value * 2;
Console.WriteLine("MultiplyByTwo:{0}.", res);
return res;
} public static double Square(double value)
{
var res = value * value;
Console.WriteLine("Square:{0}.", res);
return res; } public static void ProcessAndDisplay(Func<double, double> action, double value)
{
Console.WriteLine();
Console.WriteLine("ProcessAndDisplay called with value = {0}.", value);
double res = action(value);
}
} class Program
{
static void Main(string[] args)
{
Func<double, double> MathOperations = MathOperation.MultiplyByTwo;
MathOperations += MathOperation.Square; MathOperation.ProcessAndDisplay(MathOperations, 2);
MathOperation.ProcessAndDisplay(MathOperations, 5);
Console.ReadLine();
}
}
执行结果:
从结果可以看出,每个委托实例事实上可以包含多个方法,相当于“方法数组”,每次调用委托,都会按顺序将“方法数组”中的每个方法逐个执行过去。
要注意的是,通过一个委托调用多个方法,只要其中一个方法抛出异常,那么整个委托就会停止了。
这就是多播委托。
粗看C#委托的更多相关文章
- 粗看ES6之面向对象写法
标签: es6 在es6以前,js没有类的概念,虽然有构造函数原型的方式用来做面向对向开发,但是对于书法并不是十分友好,而且对于继承实现也不是十分友好. es6引入class constructor ...
- 粗看ES6之JSON
标签: es6 ES6新增JSON特性不是特别多,只是针对JSON某些情况下的写法上有一些优化: 当key值和value值对应变量名相同时 json对像中的方法书写 示例代码如下: <!DOCT ...
- 粗看ES6之字符串
标签: javascript es6 字符串新增特性 新增二个方法 - startsWith/endsWith 字符串模板 - 反单引号的应用 startsWith 判断字符串以是否以某某开头,返回一 ...
- 粗看ES6之数组
标签: javascript es6 数组新增方法 map(可以理解为是映射,以一定规则修改数组每一项并返回全新数组) reduce(可以理解为是汇总,一堆出来一个) filter(可以理解为过滤,筛 ...
- 粗看ES6之解构赋值
标签: javascript es6 什么是解构赋值? 示例如下: <!DOCTYPE html> <html> <head> <meta charset=& ...
- 粗看ES6之函数
标签: es6 javascript 箭头函数 ES6为了书写方便引入了函数的全新简写方式-箭头函数 <!DOCTYPE html> <html> <head> & ...
- 粗看ES6之变量
标签: javascript var定义变量面临的问题 可以重复定义 无法限制变量不可修改 无块级作用域 ES6变量定义升级 新增let定义变量 新增const定义常量 let特性 有块级作用域 不可 ...
- 匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的
0x00 前言 由于工作繁忙所以距离上一篇博客已经过去一个多月的时间了,因此决心这个周末无论如何也得写点东西出来,既是总结也是分享.那么本文主要的内容集中在了委托的使用以及内部结构(当然还有事件了,但 ...
- C#中的线程一(委托中的异步)
C#中的线程一(委托中的异步) 一.同步委托 我们平时所用的委托以同步居多,我们编写一个方法和相关委托进行演示: publicdelegatevoid DoSomethingDelegate(stri ...
随机推荐
- Java 中 StringBuilder 在高性能用法总结
关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不要用StringBuffer,然后性能就是最好的了,真的吗吗吗吗? 还有些同学,还听过三句 ...
- [置顶] 【Git入门之十五】Github操作指南
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12374633 最终篇,介绍一下Github网站的使用,主要是翻译为主,简化了 ...
- Discuz X2.5 用户名包含被系统屏蔽的字符[解决方法]
/uc_client/data/cache/badwords.php文件里的内容 删除并用 utf-8格式保存
- InnoDB 数据表压缩原理与限制
http://liuxin1982.blog.chinaunix.net/uid-24485075-id-3523032.html 压缩理念 通过提高CPU利用率和节约成本,降低数据库容量及I/O负载 ...
- rsyslogd配置文件详解
非常详细的rsyslogd配置文件解析 rsyslog服务和logrotate服务=========================================================== ...
- Qt 学习之路:QSortFilterProxyModel
从本章开始,我们将逐步了解有关自定义模型的相关内容.尽管前面我们曾经介绍过 Qt 提供的几个内置模型:QStringListModel和QFileSystemModel,但对于千变万化的需求而言,这些 ...
- Qt 学习之路 :事件
事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事 ...
- Java 日志缓存机制的实现--转载
概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印 ...
- DEDECMS织梦列表页每隔N行文章添加一条分隔线
这是给一个朋友做模板的时候,用到的一个小小的技巧,今天正好用上了,以前看到有人问过不知道解决没有,今天整理了一下,本想保存在自己的电脑里,后来一想,不如咱们一起共享一下,也是对织梦的感恩,有好东西就来 ...
- asp.net Request.ServerVariables[] 读解
获取客户端的IP地址,代码如下: /// <summary> /// 获取客户端IP地址 /// </summary> /// <returns></retu ...