读书笔记之C# delegate
c#代理的使用主要在:需要将一个方法当做参数传递到另一个方法时。
比如启动一个线程执行任务,而这个线程要执行的方法可以通过代理传递过来。
代理包括一个方法或者多个方法的地址和C++的函数指针很相似,但它是类型安全的。
1.声明代理
delegate void IntMethodInvoker(int x);
这个代理可以引用返回值类型为空,有一个参数的所有方法,很重要的一点需要知道delegate是类型安全的。
delegate double TwoLongsOp(long first, long second);
有两个参数返回值为double的代理。
delegate string GetAString();
没有参数返回值为string的代理。
public delegate string GetAString();
还可以说明代理的访问权限。
2.使用代理
使用代理必须先要实例化一个代理
pri v a te delegate string GetAString();
static void Main()
{
int x = 40;
GetAString firstStringMethod = new GetAString(x.ToString); //实例化一个代理,并把该代理指向x.tostring();
Console.WriteLine("String is {0}", firstStringMethod()); //firstStringMethod()成为x.tostring()代表(代理)
// With firstStringMethod initialized to x.ToString(),
// the above statement is equivalent to saying
// Console.WriteLine("String is {0}", x.ToString());
}
可以通过以下两种方法来调用已经实例化的方法
firstStringMethod();
firstStringMethod.Invoke();
当然在实例化一个代理的时候并传递方法也可以通过以下两种形式
GetAString firstStringMethod = new GetAString(x.ToString);
GetAString firstStringMethod = x.ToString;
请看下面代理实例
class mathOperation
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
}
定义一个方法,该方法有两个静态函数,分别用于计算值得倍数和值的平方。
class Program
{
delegate double DoubleOp(double x); //定义代理用于代理相应的方法
static void Main(string[] args)
{
DoubleOp[] operations =
{
mathOperation.MultiplyByTwo,
mathOperation.Square
}; //实例化一个代理数组,第一个数组元素代理MultiplyByTwo方法第二个数组元素代理Square方法
for(int i =0 ; i < operations.Length;i++)
{
Console.WriteLine("Using operations[{0}]:", i);
ProcessAndDisplayNumber(operations[i], 2.0);
ProcessAndDisplayNumber(operations[i], 7.94);
ProcessAndDisplayNumber(operations[i], 1.414);
Console.WriteLine();
}
}
static void ProcessAndDisplayNumber(DoubleOp action,double value) //代理作为参数进行传输
{
double result = action(value);
Console.WriteLine("Value is {0} , result of operation is {1}", value, result);
}
}
二、如果不想定义代理类型而使用代理可以使用下列代理形式
Action<T> and Func<T> Delegates
action<T>指向没有返回类型的方法,可以传递16个参数,其形式如下:
Action<in T> 指向一个参数的方法
Action<in T1, in T2> 指向两个参数的方法
Action<inT1, in T2, in T3, in T4, in T5, in T6, in T7, in T8> 指向八个参数的方法
Func<T> 最多也可以传递16个参数,并且具有返回值类型
Func<out TResult> 指向没有参数,有一个返回值类型的方法。
Func<in T, out TResult> 指向一个参数的方法
Func<in T1, inT2, in T3, in T4, out TResult> 指向一个具有四个参数的方法。
1、应用举例
在上面的实例中我们定义了一个代理来指向静态方法如下形式
delegate double DoubleOp(double x);
如果不想自己定义代理,可以使用如下形式来指向静态函数的两个方法
Func<double, double>[] operations =
{
MathOperations.MultiplyByTwo,
MathOperations.Square
}; //使用func<double, double> 来指向有返回值类型的一个参数。并不需要自己再自定代理,而使用系统自带的代理方法。
把这个代理作为参数传递给相应的方法,其格式如下
static void ProcessAndDisplayNumber(Func<double, double> action,double value) //第一个参数是代理实例,第二个参数是代理所用到的参数值
{
double result = action(value);
Console.WriteLine("Value is {0}, result of operation is {1}",
value, result);
}
读书笔记之C# delegate的更多相关文章
- 《C#图解教程》读书笔记之二:存储、类型和变量
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.类型初窥:掀起你的盖头来 (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声 ...
- 《C#图解教程》读书笔记之五:委托和事件
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执 ...
- 《编写高质量代码--Web前端开发修炼之道》读书笔记
前言 这两周参加公司的新项目,采用封闭式开发(项目成员在会议室里开发),晚上加班到很晚,所以没时间和精力写原创博客了,今天就分享下这篇<编写高质量代码--Web前端开发修炼之道>读书笔记吧 ...
- Essential C#读书笔记
Essential C#读书笔记 这是一个多变的时代,一次又一次的浪潮将不同的人推上了巅峰.新的人想搭上这一波,同时老的人也不想死在沙滩上.这些年新的浪潮又一次推开,历史不停地重复上演,那便是移动互联 ...
- Spring读书笔记——bean解析
前情回顾 上篇<Spring读书笔记--bean加载>我们从代码角度介绍了有哪些类负责解析XML文件,又是如何一步步从XML格式脱变成我们熟悉的bean的,直到DefaultBeanDef ...
- Spring读书笔记——bean创建(上)
通过<Spring读书笔记--bean加载>和<Spring读书笔记--bean解析>,我们明白了两件事. Spring如何加载消化一个xml配置文件 Spring如何将xml ...
- 《C#从现象到本质》读书笔记(六)第8章委托和事件
<C#从现象到本质>读书笔记(六)第二部分 C#特性 第8章委托和事件 从这一部分开始,知识点就相对少了,重要的是代码练习.奈何太高深的代码平常不怎么用,这些特性也不是经常写代码的. 委托 ...
- 《软件测试自动化之道》读书笔记 之 基于反射的UI测试
<软件测试自动化之道>读书笔记 之 基于反射的UI测试 2014-09-24 测试自动化程序的任务待测程序测试程序 启动待测程序 设置窗体的属性 获取窗体的属性 设置控件的属性 ...
- 《软件测试自动化之道》读书笔记 之 XML测试
<软件测试自动化之道>读书笔记 之 XML测试 2014-10-07 待测程序测试程序 通过XmlTextReader解析XML 通过XmlDocument解析XML 通过XmlPa ...
随机推荐
- 将bat文件或exe程序注册成windows服务
命令行使用sc命令.关于sc命令的详解,请自行查看帮助(sc /?),在此只简单提及如何加入系统服务功能.加入服务:sc create ServiceName binPath= 路径 start= a ...
- python 数组过滤
arr = [1,2,3,4,5,6,7,8,None]arr = [elem for elem in arr if elem != None]
- hdu 1564 Play a game(博弈找规律)
题目:一个n*n的棋盘,每一次从角落出发,每次移动到相邻的,而且没有经过的格子上. 谁不能操作了谁输. 思路:看起来就跟奇偶性有关 走两步就知道了 #include <iostream> ...
- 记JavaScript的入门学习(二)
2016年11月25号,利用上午时间学习了JavaScript的数据类型和变量,下午就该去图书馆泡书了. 看完变量的本章节,发现我可能不能一天结束,那我就利用上午和晚上九点回来的时间完成吧.把心态调整 ...
- 5754Life Winner Bo
给定一个n*m的矩阵,有四种棋子(国际象棋的王,王后,骑士,车).起点在(1,1)先走到(n,m)获胜. 分析:车是nim博弈.王后是威佐夫博弈.王和骑士写两个1000*1000的预处理即可. hdu ...
- android studio依赖库工程Activity显示问题及库工程设置
android studio引用库工程其实不难,直接添加依赖module即可,但是我在操作过程中出现一些奇怪的问题,苦扰我一整天,为了祭奠这苦命的一天特别mark一下. 首先描述一下我的错误现象: s ...
- IOS开发调整UILabel的行间距
CGFloat heih = 20; NSString * cLabelString = @"这是测试UILabel行间距的text.这是测试UILabel行间距的text.n 这是测试 ...
- 一个用于上传文件的servlet
1.jsp页面操作文件: <%@ page language="java" import="java.util.*" pageEncoding=" ...
- PHP学习过程_Symfony_(4)_命令创建实体_以及实体关系
//项目运行php app/console server:run//创建实体php app/console doctrine:generate:entitybundle名称:实体名称例如:Symfon ...
- CentOS 6.5静态IP的设置(NAT和桥接都适用)
CentOS 6.5静态IP的设置(NAT和桥接都适用) 为了方便,用Xshell来.并将IP设置为静态的.因为,在CentOS里,若不对其IP进行静态设置的话,则每次开机,其IP都是动态变化的,这样 ...