C# 之 托付
托付(delegate)
托付是一种能够把引用存储为函数的类型。托付也能够看成是一种数据类型,能够用于定义变量,但它是一种特殊的数据类型,它所定义的变量能接受的数值仅仅能是一个函数,更确切的说,托付类型的变量能够接受的数值仅仅能是一个函数,更确切的说,托付的变量能够接受一个函数的地址,类似于C++语言的函数指针。
托付是对函数的封装,能够当作给方法的特征指定一个名称。
托付是一种引用方法的类型。一旦为托付分配了方法,托付将与该方法具有全然同样的行为。
托付的声明
托付的声明很类似于函数,但不带函数体,且要使用delegatekeyword。托付的声明指定了一个返回类型和一个參数列表。
在定义了托付后,就能够声明该托付类型的变量。接着把这个变量初始化为与托付有同样返回类型和參数列表的函数引用。之后,就能够使用托付变量调用这个函数,就像该变量是一个函数一样。
以下来看一个小样例:
namespace 托付
{
class Program
{
//定义一个托付ProcessDelegate,其返回类型和參数与函数Multiply()和Divide()相匹配
delegate string ProcessDelegate(double param1, double param2); //定义乘法和出除法的函数
static string Multiply(double param1, double param2)
{
return Convert.ToString(param1 * param2);
}
static string Divide(double param1, double param2)
{
if (param2!=0)
{
return Convert.ToString(param1 / param2);
}
else
{
return "除数不能为0!";
}
}
static void Main(string[] args)
{
ProcessDelegate process; //使用新的托付类型声明一个变量 //请求用户由逗号分隔两个数字,并把这些数字仿真两个double变量中
Console.WriteLine("Enter 2 number separated with a comma:");
string input = Console.ReadLine();
int commaPos = input.IndexOf(',');
double param1 = Convert.ToDouble(input.Substring(0, commaPos));
double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1)); //让用户选择操作符
Console.WriteLine("Enter M to mitiply or D to divide:");
input = Console.ReadLine(); //依据用户的选择,初始化process托付变量
if (input=="M")
{
process = new ProcessDelegate(Multiply);
}
else
{
process = new ProcessDelegate(Divide);
} //把托付变量看作一个函数名
Console.WriteLine("Result:{0}", process(param1, param2));
Console.Read();
}
}
}
为了说明问题,这里没有验证用户输入的有效性。假设这些是“现实中的”代码,就应花很多其它时间来确保在局部变量param1和param2中得到有效的值。
通过上面的小样例我们能够知道托付的详细实现步骤:
1.先声明一个托付实例
2.提供要处理的方法
3.实例化托付(把托付看作是类的话,实例化托付就不难理解了,其參数是要处理的方法,这里的方法不用加括号,实例化的过程就是装载方法的过程)实例化后的托付对象就好比是C++中的指针,它本身就是封装了方法的对象
4.最后我们调用托付对象就好比调用了被封装方法本身,调用时的參数也就传给了被封装的方法
C# 之 托付的更多相关文章
- C# Func<>托付
曾经我们为了可以调用一个方法.必须比照这种方法定义一个对应的delegate. 原先我们定义delegate // 托付声明 -- 定义一个签名: delegate double MathAction ...
- OC中类别、扩展、协议与托付
类别(category)--通过使用类别,我们能够动态地为现有的类加入新方法.并且能够将类定义模块化地分不到多个相关文件里.通常仅仅在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有&qu ...
- C#高级编程三十天----泛型结构,泛型方法,泛型托付
泛型结构 泛型结构和泛型类差点儿是一直的,仅仅是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数 ...
- WF4.0——升级技能:托付应用
回想: 在一个月前,我们刚刚回想了面对象至关重要的部分:托付,详细请移步我们博客:面向对象--一起来复习托付与事件!关于这篇博客的详细内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的详细怎样解 ...
- c#Lamdba表达式与托付
介绍: "Lambda表达式"(lambda expression)是一个匿名函数,在C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,能够包括表达式和语句,而且可用 ...
- javascript --- 事件托付
javascript 之 事件托付 长处:1.提高性能(仅仅须要对父级进行操作,子节点相同会拥有其相关属性和方法) 2.对于新加入的事件.也让其拥有父级事件的属性 <!doctype html& ...
- C#托付和事件
C#托付.我看了非常长时间的资料和帖子, 曾经对托付的理解就是托付事实上就是将一个方法作为參数传递给第一个方法. 如今对托付的认识则变了一些的,托付能够实现: 1.在两个不能直接调用的方法之间做为桥梁 ...
- cocos2d-x 托付模式的巧妙运用——附源代码(一)
先来说一下托付模式是什么.以下的内容摘要自维基百科: 托付模式是软件设计模式中的一项基本技巧.在托付模式中,有两个对象參与处理同一个请求.接受请求的对象将请求托付给还有一个对象来处理.托付模式是一项基 ...
- JS和JQuery中的事件托付 学习笔记
事件托付事实上并非一个非常高级的技巧,比方在一个页面里面.当仅仅存在两个button的时候.可能你给button加入监听是这种:(本文不考虑浏览器兼容性.关于事件的兼容性可參考前面的学习笔记) < ...
随机推荐
- 也可以看看GCD(杭州电2504)(gcd)
也可以看看GCD Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- PHP于DIRECTORY_SEPARATOR任务
DIRECTORY_SEPARATOR是php的内部常量.用于显示系统分隔符的命令,不须要不论什么定义与包括就可以直接使用. 在windows下路径分隔符是\(当然/在部分系统上也是能够正常执行的), ...
- Java绘制艺术图形
本例主要是通过使用坐标轴平移,图形旋转和获得随机数等技术来绘制艺术图案.通过重写JPanel类中的paint()方法,并在该方法中使用Graphics2D类中的translate(),setColor ...
- WebStorm的compass配置
在webstorm中配置compass WebStorm是功能强大的前端开发专用IDE,拥有即时编辑(chrome).自动完成.debugger.Emmet.HTML5 支持.JSLint.Less. ...
- tornado的GET POST方法样品展示
举例说明get和post该方法的用途: 一.演示样例用的GET方法: import tornado.ioloop import tornado.web class MainHandler(tornad ...
- C#
抽象类其中创建一个静态方法
</pre><pre name="code" class="csharp"><span style="font-size ...
- Python网络02 Python服务器进化
原文:Python网络02 Python服务器进化 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! **注意,在Python 3. ...
- LinkedBlockingQueue的put,add跟offer的区别(转)
LinkedBlockingQueue的put,add和offer的区别 最近在学习<<Java并发编程实践>>,有很多java.util.concurrent包下的新类.Li ...
- vs2013 ADO联系SQL server2012数据库
平时,给定ADO例如使用以下过程数据源中的数据的数据库应用程序 (1) 创建一个Connection 物.定义的连接字符串信息.它包含了数据源名称.用户ID.密码.连接超时 . 默认数据库的位置和光标 ...
- 写得好 git 提交信息
编写好 git 提交信息 提交信息 我们作出答复,更改将提交相关信息,这些信息通常被认为是重要的信息会小心留下应该离开,你为什么需要这个提交实例,提交解决任何问题. 我们需要良好的信息组织,虽然后来, ...