托付(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# 之 托付的更多相关文章

  1. C# Func<>托付

    曾经我们为了可以调用一个方法.必须比照这种方法定义一个对应的delegate. 原先我们定义delegate // 托付声明 -- 定义一个签名: delegate double MathAction ...

  2. OC中类别、扩展、协议与托付

    类别(category)--通过使用类别,我们能够动态地为现有的类加入新方法.并且能够将类定义模块化地分不到多个相关文件里.通常仅仅在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有&qu ...

  3. C#高级编程三十天----泛型结构,泛型方法,泛型托付

    泛型结构 泛型结构和泛型类差点儿是一直的,仅仅是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数 ...

  4. WF4.0——升级技能:托付应用

    回想: 在一个月前,我们刚刚回想了面对象至关重要的部分:托付,详细请移步我们博客:面向对象--一起来复习托付与事件!关于这篇博客的详细内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的详细怎样解 ...

  5. c#Lamdba表达式与托付

    介绍: "Lambda表达式"(lambda expression)是一个匿名函数,在C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,能够包括表达式和语句,而且可用 ...

  6. javascript --- 事件托付

    javascript 之 事件托付 长处:1.提高性能(仅仅须要对父级进行操作,子节点相同会拥有其相关属性和方法) 2.对于新加入的事件.也让其拥有父级事件的属性 <!doctype html& ...

  7. C#托付和事件

    C#托付.我看了非常长时间的资料和帖子, 曾经对托付的理解就是托付事实上就是将一个方法作为參数传递给第一个方法. 如今对托付的认识则变了一些的,托付能够实现: 1.在两个不能直接调用的方法之间做为桥梁 ...

  8. cocos2d-x 托付模式的巧妙运用——附源代码(一)

    先来说一下托付模式是什么.以下的内容摘要自维基百科: 托付模式是软件设计模式中的一项基本技巧.在托付模式中,有两个对象參与处理同一个请求.接受请求的对象将请求托付给还有一个对象来处理.托付模式是一项基 ...

  9. JS和JQuery中的事件托付 学习笔记

    事件托付事实上并非一个非常高级的技巧,比方在一个页面里面.当仅仅存在两个button的时候.可能你给button加入监听是这种:(本文不考虑浏览器兼容性.关于事件的兼容性可參考前面的学习笔记) < ...

随机推荐

  1. jQuery Mobile发展新闻阅读器,适应iphone和android打电话

    程序猿是很不赖,你知道. 我们经常新浪,腾讯.雅虎等各大网站看到上述新闻.他们还推出了自己的移动新闻阅读器.今天,我自己用的jQuery Mobile 为了实现这一功能,.图像大小上传限制的大小250 ...

  2. redis内存管理代码的目光

    zmalloc.h /* zmalloc - total amount of allocated memory aware version of malloc() * * Copyright (c) ...

  3. windows屏幕保护程序opengl模板

    Visual Studio 2013 屏幕保护程序opengl模板 ScreenSaver.cpp #define VC_EXTRALEAN #include <windows.h> #i ...

  4. 【甘道夫】HBase连接池 -- HTablePool是Deprecated之后

    说明: 近期两天在调研HBase的连接池,有了一些收获,特此记录下来. 本文先将官方文档(http://hbase.apache.org/book.html)9.3.1.1节翻译,方便大家阅读,然后查 ...

  5. Python补充04 Python简史

    原文:Python简史 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python是我喜欢的语言,简洁,优美,容易使用.前两天, ...

  6. 杭电1233还是畅通project

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  7. CoffeeScript NgComponent

    Angular遇上CoffeeScript - NgComponent封装 CoffeeScript是基于JavaScript的一门扩展小巧语言,它需要编译成JavaScript,然后再运行与浏览器或 ...

  8. JavaScript的隐式转换

    原文:JavaScript的隐式转换 JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object.object是引用类型,其它 ...

  9. Google调试技巧总结

    工欲善其事 工欲善其事,必先利器. Google调试面板一一介绍:F12回想一下大家都应该知道,哈哈 element面板 这个面板显示了页面所有html代码.用于调试css代码.右側展示左側相应选择元 ...

  10. ubuntu 14.04 安装搜狗拼音输入法

    原文:ubuntu 14.04 安装搜狗拼音输入法 ubuntu桌面系统下终于有了好用的拼音法-搜狗拼音输入法,欲在ubuntu 14.04下安装搜狗拼音输入法相当的简单. 先到搜狗拼音官网下载对应的 ...