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加入监听是这种:(本文不考虑浏览器兼容性.关于事件的兼容性可參考前面的学习笔记) < ...
随机推荐
- C++中的class (2)
class Father { protected void methodA(){ //do something } private void methodB(){//do something } } ...
- 类似的微博推断客户关系sql声明
类别似新浪微博的关注和共同关心 不知道别人是怎么设计的. 反正我是例如以下设计的 ID USER FRIEND 1 A B 2 B A 3 ...
- What is Observer and Observable and when we used these?
转会:http://stackoverflow.com/questions/13744450/interview-when-do-we-use-observer-and-observable
- JAVA基金会 (三)反射 反思的深度分析
上一页已经推出反映的一些基本概念,这主要是通过一个例子反映谈的过程,以及样品的实际应用. 这个样例是这种设计思路:从一个属性文件里读取一段字符串,然后,依据该字符串生成相应的类实例对象:这之后另一个增 ...
- Java 理论与实践: 正确使用 Volatile 变量(转)
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少, ...
- POJ 1631 Bridging signals(LIS 二分法 高速方法)
Language: Default Bridging signals Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1076 ...
- 使用C#在Windows应用商店程序中获取CPU信息
using Windows.Devices.Enumeration; string guidStr="{97FADB10-4E33-40AE-359C-8BEF029DBDD0}" ...
- 关于int全区变量读写的原子性
关于int全区变量读写的原子性 关于int变量的读写是否原子性网上有非常多讨论,貌似不同平台不同,这里自己做实如今arm9平台測试.这里要注意原子性并不是指一条汇编才原子,实际上即使一次赋值编 ...
- 定制Attribute
目录 Attribute是什么 自定义Attribute 一.Attribute是什么 将一些附加信息与制定目标相关联的方式.编译器在元数据中生成这些额外的信息.也叫做特性. 比如之前文章中提到的:枚 ...
- SQL开发中容易忽视的一些小地方(二)
原文:SQL开发中容易忽视的一些小地方(二) 目的:继上一篇:SQL开发中容易忽视的一些小地方(一) 总结SQL中的null用法后,本文我将说说表联接查询. 为了说明问题,我创建了两个表,分别是学生信 ...