托付(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. Android供TextView添加多个点击文字

    我们使用社会性软件的过程中会或多或少像别人的帖子点,图. : 能够看到用户页面显示出来的仅仅是点了赞的用户的名称,点击这些名称能够进入到该用户的主页.我们就来实现相似的效果.直接上代码吧. @Over ...

  2. 开玩笑html5(五岁以下儿童)---绕地球月球,地球绕太阳运动(canvas实现,同样可以移动哦)

    请珍惜劳动小编成果,这篇文章是原来小编,转载请注明出处. 速度的參数与真实速度有点差距.大家能够自行调整 <!DOCTYPE html> <html> <head> ...

  3. transform:translateZ() 字体模糊问题 父类重返Z轴平面

    translateZ()变糊 第一种情况: 当translateZ(m)中的 m设置为 非整数,1.5px 之类的,字体会模糊,但是不明显;和浏览器渲染,字体格式,或者操作系统有关, 这个 css中 ...

  4. boost准模板库scoped_ptr指针的使用以及auto_ptr智能指针的对照

    首先我们看看scoped_ptr的基本使用,包括了swap(),get(),reset()的使用,重要的提醒是作用域结束的时候会自己主动析构,无需手动的释放资源: #include<boost/ ...

  5. 杭州电 1052 Tian Ji -- The Horse Racing(贪婪)

    http://acm.hdu.edu.cn/showproblem.php? pid=1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS ...

  6. VS2008让自己掌控的定义编译项目后,自己主动添加到工具箱

    在VS2008中,假设在项目里写了一个用户控件.编译后这个控件是不会自己主动出现到工具箱的.按例如以下设置就能够解决问题 工具=>选项=>Windows窗口设计器=>常规=>A ...

  7. ABP展现层——Javascript函数库

    ABP展现层——Javascript函数库 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.N ...

  8. requestWindowFeature()应用

    我们在开发程序是常常会须要软件全屏显示.自己定义标题(使用button等控件)和其它的需求,今天这一讲就是怎样控制Android应用程序的窗口显示. 首先介绍一个重要方法那就是requestWindo ...

  9. JavaScript之事件处理详解

    一.事件传播机制 客户端JavaScript程序(就是浏览器啦)采用了异步事件驱动编程模型.当文档.浏览器.元素或与之相关的对象发生某些有趣的事情时,Web浏览器就会产生事件(event).如果Jav ...

  10. Poj 3517 And Then There Was One Joseph核心问题

    基本上纯Joseph核心问题,只是第一步多一件.m. 然后你就可以用获得的递推公式: Win(n) 代表n当个人的中奖号码, 然后,Win(n)必须相等Win(n-1).当一个人将在下一次删除队列. ...