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 ...
随机推荐
- 【C语言】练习2-1
题目来源:<The C programming language>中的习题P27 练习2-1: 编写一个程序以确定分别由signed及unsigned限定的char.short.int ...
- 转如何用九条命令在一分钟内检查Linux服务器性能?
一.uptime命令 $ uptime :: up :, user, load average: 30.02, 26.43, 19.02 这个命令可以快速查看机器的负载情况.在Linux系统中, ...
- 8个实用而有趣Bash命令提示行
很多人都对过命令行提示的重要性不屑一顾,甚至是一点都不关心.但是我却一点都不这么认为,一个好的命令行提示可以改变你使用命令的方式.为此,我在internet上找到一些非常实用,优秀,并有趣的bash的 ...
- PowerDsigner 16逆向工程导入mysql
由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1. 安装MYSQL的ODBC驱动 Connector/ODBC 5.1.1 ...
- ASP.NET项目在IIS上使用虚拟目录
在IIS中,应用程序与虚拟目录特别容易混淆,但两者又是完全不同的概念. 应用程序是一个逻辑边界,这个边界可以分隔网站及其组成部分.虚拟目录则是一个真实的指针,这个指针指向了一个本地或远程的物理路径.虚 ...
- Python 实现进程间通信(网络编程)
[网络编程] 1):网络编程是什么意思,网络编程指的是不同机器之间通过网编相互发信息,我们常用的“QQ”,“微信”,“邮箱” 都个网编编程的应用: 网编编程在技术上还有另一个叫法叫“进程间通信”,进程 ...
- Centos 二进制安装node.js
一.登录node的官网查看最新的稳定版,以及需要下载的Linux版本,你可以有多种Linux安装方式(源码安装,二进制安装等). 二.Node安装及配置 1.创建安装目录:创建目录node.js [r ...
- Windows搭建测试RabbitMq遇到的问题
报错: d:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin>rabbitmq-plugins eble rabbitmq_ma ...
- curl以cookie的方式登录
curl -o /dev/null -s -w ‘%{time_connect}:%{time_starttransfer}:%{time_total}’ --cookie "UM_dist ...
- nginx加载字体文件的时候报错
nginx 下加载配置 location ~* \.(eot|ttf|ttc|otf|eot|woff|woff2|svg)$ { root /web/static_jr ...