说明(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. matlab入门笔记(二):矩阵和数组

    摘自<matlab从入门到精通>胡晓东 matlab最基本的数据结构就是矩阵,一个二维的.长方形形状的数据,可以用易于使用的矩阵形式来存储,这些数据可以是数字,字符.逻辑状态,甚至是mat ...

  2. 怎样让HTML 表格中内容自动换行??

    <table style="word-break:break-all; word-wrap:break-all;">

  3. U811.1接口EAI系列之一--通用把XML传送给EAI处理方法--PowerBuilder语言

    1.前面配置参考:http://www.cnblogs.com/spring_wang/p/3393147.html 2.pb通用调EAI方法代码如下: //===================== ...

  4. 使用 sqlyog 导入导出数据显示 lost connection to mysql server during query

    mysql中经常需要备份数据,在使用 sqlyog 进行备份数据库为转储文件,然后在其他数据库中导入发生 lost connection 经过查询大量资料是数据库配置的 max_allowed_pac ...

  5. zookeeper 的日常管理

    http://www.cnblogs.com/ggjucheng/p/3352591.html

  6. jQuery学习笔记(jquery.form插件)

    官网: http://malsup.com/jquery/form/ jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Fo ...

  7. C++的string类常见用法

    C++的string常见用法,在网上看到一篇,但是不能在c++11编译器下运行,我修改了下,还没改完: #include<iostream> #include<string> ...

  8. Atitit 图像处理类库安装与安装模式的前世今生与未来大趋势attilax总结.docx

    Atitit 图像处理类库安装与安装模式的前世今生与未来大趋势attilax总结.docx 1. 安装的原理,主要是解压,复制,设置三大步1 2. 目前我们常见的三大种安装模式,二进制模式与源码安装模 ...

  9. CodeForces 493B Vasya and Wrestling 【模拟】

    B. Vasya and Wrestling time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. 菜鸟学Java(十二)——搭建一个完整的Java开发环境

    作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse ...