C#学习笔记(10)——再谈委托,不同国家问候的例子
说明(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)——再谈委托,不同国家问候的例子的更多相关文章
- IBatis.Net学习笔记六--再谈查询
在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的 ...
- 《C++ Primer Plus》学习笔记10
<C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...
- Hadoop学习笔记(10) ——搭建源码学习环境
Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...
- Android:日常学习笔记(10)———使用LitePal操作数据库
Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- SQL反模式学习笔记10 取整错误
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
随机推荐
- 【Android】播放音频的几种方式介绍
接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPl ...
- 【MAVEN】如何在Eclipse中创建MAVEN项目
目录结构: contents structure [+] 1,Maven简介 2,Maven安装 2.1,下载Maven 2.2,配置环境变量 2.3,测试 3,Maven仓库 3.1,Maven仓库 ...
- AndroidStudio OpenCv的配置,不用安装opencv manager
按照以下操作步骤配置并测试了,没问题. 下载OpenCV sdk for Android,解压(我的解压地址是F:\OpenCV-android-sdk) 1)新建项目项目,取名为Opencvtest ...
- 【C语言】练习2-1
题目来源:<The C programming language>中的习题P27 练习2-1: 编写一个程序以确定分别由signed及unsigned限定的char.short.int ...
- ldd命令
ldd命令用于判断某个可执行的 binary 档案含有什么动态函式库. 参数说明: --version 打印ldd的版本号 -v --verbose 打印所有信息,例如包括符号的版本信息 -d --d ...
- 在windows 上统计git 代码量
1 需要系统安装 git + gawk git 安装自行百度 gawk 到官网下载 http://gnuwin32.sourceforge.net/packages/gawk.htm 1.2 下载好后 ...
- java 8中列表对象多条件排序
java 8 新加了 lambda 表达式,当接口是一个 @FunctionalInterface 时可以使用 lambda 表达式代替 Function典型的应用场景为:A. 1个只有1个方法的接口 ...
- 微信小程序 开发过程中遇到的坑(一)
2124 1.我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 的时候在pages中写注释的时候回报错. 例如: { &quo ...
- Atitit vue.js 把ajax数据 绑定到form表单
Atitit vue.js 把ajax数据 绑定到form表单 1.1. 使用场景:主要应用在编辑与提交场合..1 1.2. 绑定数据到form控件,可以使用jquery,不过vue.js更加简单1 ...
- Atitit js canvas的图像处理类库attilax总结与事业
Atitit js canvas的图像处理类库attilax总结与事业 1.1. 脸部识别JavaScript类库Tracking.js1 1.2. AlloyImage特性1 1.3. CamanJ ...