托付(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. 飞信免费邮件api,飞信界面

    大家都知道飞信是能够免费发送短信的,可是飞信又没有官方的接口,所以无法借用移动的官方接口实现短信的免费发送,可是还是有一些破解的接口能够使用的. GET方法: 提交格式 http://66.zzuob ...

  2. Ubuntu 下一个disk清理保护

    有很长一段时间ubuntu人,很多人会突然提示:磁盘空间不足1G. 然后很长一段时间分析..最近遇到的类别似问题.记录,如下面: 一个:.xsession-errors.old 能够在终端看到主用户文 ...

  3. cocos2d-x lua 学习笔记(1) -- 环境结构

    Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...

  4. 复制(5)——事务复制中的发布者(Publisher)

    发布者是所有被复制(replicated)的数据的集合.每个发布者可以有多个发布(publication),每个发布项包含多个项目(articles),但是这些发布必须处于一个单一的数据库中,而每个项 ...

  5. fragment 中利用spinner实现省市联动

    (1)布局文件就不在说明了,主要说代码的实现,先把代码贴上! package com.example.cl; import android.annotation.SuppressLint; impor ...

  6. Spring Framework 下载链接_现在有空

    下载链接:http://repo.spring.io/libs-release-local/org/springframework/spring/ 点击打开链接 包括Spring的各个版本号: 3.2 ...

  7. 简单的方法来改善手机3G上网速度(2G转3G)

           这里提到的方法是将手机信号不好的地方(也就是2G信号)强制转换为3G信号上网以至于提高上网速度,大家常常看到在某个地方(比方坐地铁)手机明明是3G卡,却显示的是2G信号,这就是手机老在2 ...

  8. 了解webpack

    学习笔记 一步步了解webpack   前言 demo 地址: https://github.com/yy8597/webpack-demos 之前学习了 broswerify,发现确实很好用.虽然没 ...

  9. 监测谁用了SQL Server的Tempdb空间

    原文:监测谁用了SQL Server的Tempdb空间 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/02/11/sql-server-tempdb. ...

  10. DataNode连接错误Retrying connect to server

      在Hadoop分布式模式部署完毕后,通过start-dfs.sh启动NameNode.DataNode.SecondaryNameNode,在master节点通过jps命令查看,看到NameNod ...