C#入门经典

第六章 6.6

委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。

委托的声明指定了一个返回类型和一个参数列表。

在定义了委托后,就可以声明该委托类型的变量。

接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用。

之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

有了引用函数的变量后,还可以执行不能用其它方式完成的操作。

例如,可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用引用它的任何函数。

而且在运行之前无需知道调用的是那一个函数。

class Ch06Ex05
{
//委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。
//委托的声明指定了一个返回类型和一个参数列表。
delegate double ProcessDelegate(double a,double b);//返回类型是double,参数列表:两个double变量a和b
static double Multiply(double x,double y)
{
return x * y;
} static double Divide(double m, double n)
{
return m / n;
} public static void Method()
{
ProcessDelegate process;//在定义了委托后,就可以声明该委托类型的变量。
process = new ProcessDelegate(Multiply);//把委托变量初始化为与委托有相同返回类型和参数列表的函数引用。
Console.WriteLine("Multiply(100,10)={0}", process(, ));//使用委托变量调用这个函数,就像该变量是一个函数一样
process = new ProcessDelegate(Divide);//把委托变量初始化为与委托有相同返回类型和参数列表的函数引用。
process(, );//使用委托变量调用这个函数,就像该变量是一个函数一样
Console.WriteLine("Divide(100,10)={0}", process(, ));
}
} class Program
{
/// <summary>
/// 主函数
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Chapter06.Ch06Ex05.Method();
Console.Read();
}
}

delegate关键字指定该定义是用于委托的,而不是用于函数的(该定义所在的位置与函数定义相同)

委托的三种用法

class Test
{
delegate void TestDelegate(string s);
static void M(string s)
{
Console.WriteLine(s);
} static void Main(string[] args)
{
// Original delegate syntax required
// initialization with a named method.
TestDelegate testDelA = new TestDelegate(M); // C# 2.0: A delegate can be initialized with
// inline code, called an "anonymous method." This
// method takes a string as an input parameter.
TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); }; // C# 3.0. A delegate can be initialized with
// a lambda expression. The lambda also takes a string
// as an input parameter (x). The type of x is inferred by the compiler.
TestDelegate testDelC = (x) => { Console.WriteLine(x); }; // Invoke the delegates.
testDelA("Hello. My name is M and I write lines.");
testDelB("That's nothing. I'm anonymous and ");
testDelC("I'm a famous author."); // Keep console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Hello. My name is M and I write lines.
That's nothing. I'm anonymous and
I'm a famous author.
Press any key to exit.
*/

ps:还有一种用法是,直接把方法名赋值给委托,不需要new

C#入门经典 第六章 委托的更多相关文章

  1. C#入门经典第六章函数-2-委托

    委托:

  2. 算法入门经典-第六章 例题6-21 SystemDependencies

    题意:软件组件之间会有依赖关系,比如你下一个Codeblocks你也得顺带着把编译器给下上.你的任务是模拟安装和卸载软件组件的过程.有以下五种指令,如果指令为“END”则退出程序:若为以下四种指令,则 ...

  3. 算法入门经典第六章 例题6-14 Abbott的复仇(Abbott's Revenge)BFS算法实现

    Sample Input 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ELF * 2 3 SF ...

  4. Oracle编程入门经典 第12章 事务处理和并发控制

    目录 12.1          什么是事务处理... 1 12.2          事务处理控制语句... 1 12.2.1       COMMIT处理... 2 12.2.2       RO ...

  5. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  6. Perl语言入门:第六章习题:处理用户所指定的名字并汇报相应的姓。

    37 print "\n----------------------------------_exercise_6_1--------------------------\n";  ...

  7. C语言编程入门之--第六章C语言控制语句

    导读:本章带读者理解什么是控制语句,然后逐个讲解C语言常用的控制语句,含有控制语句的代码量多起来后就要注意写代码的风格了,本章末节都是练习题,大量的练习才能掌握好控制语句的使用. 6.1 什么是控制语 ...

  8. 算法竞赛入门经典_第二章:循环结构程序设计_上机练习_MyAnswer

    习题2-1 位数 输入一个不超过109的正整数,输出它的位数.例如12735的位数是5.请不要使用任何数学函数,只用四则运算和循环语句实现. #include<stdio.h> int m ...

  9. <算法竞赛入门经典> 第8章 贪心+递归+分治总结

    虽然都是算法基础,不过做了之后还是感觉有长进的,前期基础不打好后面学得很艰难的,现在才慢慢明白这个道理. 闲话少说,上VOJ上的专题训练吧:http://acm.hust.edu.cn/vjudge/ ...

随机推荐

  1. vue 中 命名视图的用法

    今天主要记录  vue中命名视图的用法 先奉上官网网址:https://router.vuejs.org/zh/guide/essentials/named-views.html 一般情况下,一个页面 ...

  2. 最新版OpenWrt编译教程,解决依赖问题

    Install git , to conveniently download the OpenWrt source code, and build tools to do the cross-comp ...

  3. mysql 权限管理 记录

    授权操作只能用root账号,其他账号都不行 创建一个mike账号 mysql'; Query OK, rows affected (0.08 sec) 查看是否创建账号 select * from m ...

  4. jquery两稳定版本比较~~

    jquery历经了多个版本的更新,版本上的比较貌似没什么必要性,一般来说新的版本会比旧的版本各方面都略有提升,但由于新版中增加了各种新的功能,难免会引起bug的发生.评估一个版本是否适合当前开发场景使 ...

  5. There are 2 missing blocks. The following files may be corrupted

    There are 2 missing blocks. The following files may be corrupted: 步骤1,检查文件缺失情况 可以看到, blk_1074785806 ...

  6. oj2892(字典树)

    一改时间以后WA了,我就知道这题是考字典树,可惜代码怎么也不会敲了,郁闷. #include <stdio.h>#include <string.h>#include < ...

  7. testng入门教程14数据驱动(不同文件)

    数据与test脚本不在同一文件时,下面是数据: package data_driver_two_parts; import org.testng.annotations.DataProvider; p ...

  8. Android弹性滑动的三种实现方式

    引言 上一篇文章我们介绍了实现弹性滑动的三种方式,但仅仅是给出了代码片段和方法理论.今天我们结合一个具体的例子来谈一下如何使用这三种方法来实现弹性滑动.今天我们的例子是仿IOS的下拉操作,我们知道An ...

  9. 软件包管理:yum在线管理-yum命令

    只要我们的电脑可以接入互联网,那么yum源就是配好的,yum命令可以直接使用. 列出的是服务器上全部的rpm包. 包名,包全名的概念只在rpm手动管理时有用. 关键字主要指包名,只要知道了关键字就可以 ...

  10. http协议基础(四)http状态码

    一:http状态码 表示客户端http请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作 状态码的类别如下: http状态码种类繁多,大概有60多种,实际上经常使用的只有14种,下面为一 ...