说明(2017-6-14 09:08:38):

1. 首先是一个简单的委托

(1)命名空间下定义一个委托MyDel:

public delegate void MyDel(string name);

这个委托其实就是个壳,用来替换后面的EnglishSayHello和ChineseSayHello。

(2)声明一个函数SayHello来存放这个委托:public static void SayHello(string name,MyDel del)。

(3)然后在主函数里就可以使用这个SayHello函数调用委托,里面就可以换这两个方法了:

SayHello("Jack",EnglishSayHello);
SayHello("Ashley",ChineseSayHello);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11控制台委托
{
public delegate void MyDel(string name);
class Program
{
static void Main(string[] args)
{
SayHello("Jack",EnglishSayHello);
SayHello("Ashley",ChineseSayHello);
Console.ReadKey();
}
public static void SayHello(string name,MyDel del)
{
del(name);
} public static void EnglishSayHello(string name)
{
Console.WriteLine("Good Morning! "+name);
}
public static void ChineseSayHello(string name)
{
Console.WriteLine("早上好!"+name);
}
}
}

2. 然后是委托的绑定:

其实可以不需要SayHello这个中间方法的,直接在主函数里实例化一个委托,但是不能new Delegate(),因为会提示“没有0个参数的重载”。

要这样,赋值一个方法:

MyDel del = EnglishSayHello;

再这样,再绑定一个方法:

del += ChineseSayHello;

调用这个委托后,会依次调用所有绑定的方法,所以直接输出两句问候了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11控制台委托
{
public delegate void MyDel(string name);
class Program
{
static void Main(string[] args)
{
MyDel del = EnglishSayHello;
del += ChineseSayHello;
del("Jack");
//SayHello("Jack",EnglishSayHello);
//SayHello("Ashley",ChineseSayHello);
Console.ReadKey();
}
//public static void SayHello(string name,MyDel del)
//{
// del(name);
//} public static void EnglishSayHello(string name)
{
Console.WriteLine("Good Morning! "+name);
}
public static void ChineseSayHello(string name)
{
Console.WriteLine("早上好!"+name);
}
}
}

3. 修改一下代码,以便下面引出事件:

这个做法不保密,如果用private修饰符,不能访问就失去委托的意义了;如果用public修饰符,委托可以随便赋值了不安全。因此需要使用事件event,将委托进行封装,只能+=和-=,不能=赋值。相当于字段与属性。

(1)MyDelegate类,把上面的几个方法放到单独的类文件里(实际开发中的样子),并且在类里直接定义一个MyDel类型的del字段,在SayHello里,判断一下del是否为空,不为空就调用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11控制台委托
{
public delegate void MyDel(string name);
class MyDelegate
{
public MyDel del;
public void SayHello(string name)
{
if (del != null)
{
del(name);
} }
public void EnglishSayHello(string name)
{
Console.WriteLine("Good Morning! " + name);
}
public void ChineseSayHello(string name)
{
Console.WriteLine("早上好!" + name);
}
}
}

(2)Program类,实例化MyDelegate,将md.del赋值和绑定两个方法,md.SayHello的时候就只带name参数就可以了,不需要del参数了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11控制台委托
{
//public delegate void MyDel(string name);
class Program
{
static void Main(string[] args)
{
MyDelegate md = new MyDelegate();
md.del = md.EnglishSayHello;
md.del += md.ChineseSayHello;
md.SayHello("Jack"); Console.ReadKey();
}
}
}

4. 事件,到这里其实就很简单了,把上面的代码简单修改两处:

(1)在MyDel委托前面加个event关键字:

(2)这时候就会提示:

将=变成+=,问题解决:

参考资料:

http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

C#学习笔记(10)——再谈委托,不同国家问候的例子的更多相关文章

  1. IBatis.Net学习笔记六--再谈查询

    在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的 ...

  2. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  3. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  4. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

  5. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  6. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  7. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  8. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  9. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  10. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

随机推荐

  1. 【MySQL】mysql出现错误“ Every derived table must have its own alias”

    Every derived table must have its own alias 这句话的意思是说每个派生出来的表都必须有一个自己的别名 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时 ...

  2. controller.tabBarItem.title = @"11111"不显示

    场景: 在xcode8.3下  今天在弄工程的时候,发现把之前工程中的tabbar控制器拿过来后,在控制器里面用 controller.tabBarItem.title = @"11111& ...

  3. Windows 10安装DockerToolBox失败处理方法

    指令运行报错: Windows 10安装DockerToolBox失败处理方法:升级Windows 10. (注意:只有Windows10 专业版才支持升级,Server和企业版无效)

  4. 不常用但很有用的git show 和 git blame

    团队使用git 合作时,可能遇见想要查看一段比较难以阅读代码, 此时可能需要联系最新的修改者是哪位,这时候最有用的最快捷的方法就是git blame 啦, 这个指令的output是一个文件的各个区域段 ...

  5. 章节1:SQL语言简易入门

    一.增.删.改.查 1.增(向表格中插入数据): INSERT INTO tb_TableName(ColumnName1,ColumnName2) VALUES(ColumnValue1,Colum ...

  6. Map和JSON的互相转换

    JSON-Lib方式 /**   * 函数注释:parseJSON2Map()<br>   * 用途:该方法用于json数据转换为<Map<String, Object> ...

  7. 基于tornado的爬虫并发问题

    tornado中的coroutine是python中真正意义上的协程,与python3中的asyncio几乎是完全一样的,而且两者之间的future是可以相互转换的,tornado中有与asyncio ...

  8. Python 学习参考书目推荐

    Python 学习,参考书目推荐 前言 好的技术书籍可以帮助我们快速地成长,大部分人或多或少地受益于经典的技术书籍.在「Python开发者」微信公号后台,我们经常能收到让帮忙推荐书籍的消息.这类的问题 ...

  9. swagger配置和简单使用

    说明:本地环境idea + maven3.5 + springboot2.0.0 + springfox-swagger2 2.8.0  + springfox-swagger-ui 2.8.0 +  ...

  10. PHP实现JS的无符号右移(>>>)

    举例: JS: 5>>>2 PHP function uright($a, $n) { $c = 2147483647 >> ($n - 1); return $c &a ...