委托:其实就是一种命令,A 委托 B,做事情的是 B
上面实在现实世界里,反过来在程序世界中的,委托实际上就是存储了方法的地址,做事情的任然是 B
.net,编程规范说明委托是以XXXEventHandler结尾
委托的语法格式:
public + delegate关键字 + 方法返回值 + 委托名
using System;
// 演示 A 委托 B 做事情
namespace 委托 {
class B {
public void BuyThings () {
Console.WriteLine ("A委托B去买一些生活用品");
}
public void BuyThingsTwo () {
Console.WriteLine ("A委托B去买一些生活用品 -------2");
}
}
class MainClass {
public delegate void BuyEnevtHandler(); // 声明了一个委托
public static void Main (string[] args) {
// 第一种关联委托方式
// 实例化
// BuyEnevtHandler buyHandler = new BuyEnevtHandler(new B().BuyThings);
// // 调用委托
// buyHandler ();
// 第二种关联委托方式
// 在关联委托中可以使用 += 来绑定多个委托,也可以用 -= 来取消绑定委托
// 但是前提是委托非空的
B b = new B();
BuyEnevtHandler buyHandler;
buyHandler = b.BuyThings;
// 利用 += 再绑定一个委托
buyHandler += b.BuyThingsTwo;
// 利用 -= 取消绑定一个委托
buyHandler -= b.BuyThings;
// buyHandler -= b.BuyThingsTwo; // 再取消一个委托,这时委托就是空了,所以报错,空引用异常
// 调用委托
buyHandler();
}
}
}
题:
using System;
namespace 枚举和委托的实例
{
// enum People {
// chinese,
// english
// }
//
//
// class MainClass
// {
// public void Chinese (string name) {
// Console.WriteLine ("你好" + name);
// }
//
// public void English (string name) {
// Console.WriteLine ("Hello" + name);
// }
// public void SayHi (string name,People people) {
// switch (people) {
// case People.chinese:
// Console.WriteLine ("你好," + name);
// break;
// case People.english:
// Console.WriteLine ("Hello," + name);
// break;
// default:
// Console.WriteLine ("暂时没有这个语言哟~");
// break;
// }
// }
// public static void Main (string[] args)
// {
// MainClass mc = new MainClass ();
// mc.SayHi ("张三",People.chinese);
// mc.SayHi ("zhangsan", People.english);
// }
// }
class MainClass2 {
public delegate void Language(string name);
public static void Chinaese (string name) {
Console.WriteLine ("你好\t" + name);
}
public static void English (string name) {
Console.WriteLine ("Hello\t" + name);
}
public static void Japanese (string name) {
Console.WriteLine ("おはようございます。こんにちは。こんばんは\t" + name);
}
public void SayHi (string name,Language language) {
// language(name);
language.Invoke (name);
}
public static int Main (string[] args) {
MainClass2 mc2 = new MainClass2 ();
mc2.SayHi ("老王", MainClass2.Chinaese);
mc2.SayHi ("Laowang", MainClass2.English);
mc2.SayHi ("のはたの ゆい", MainClass2.Japanese);
return 0;
}
}
}
事件就是类在发生一些事情的时候通知其他类的一种方式
事件一般会牵扯到了两个角色
1.事件发起者(sender/publisher):实际上就是事件的发起者
2.事件订阅者(Receiver):对发起者发的通知感兴趣的话,就可以订阅该事件
事件绝大部分都要和委托连用
using System;
namespace 事件 {
class SendMarryMessageMa {
// 声明一个委托
public delegate void SenderEventHandler();
// 为委托绑定事件
public event SenderEventHandler OnPublisher;
public void Marry () {
if (OnPublisher != null) {
Console.WriteLine ("我又结婚了,各位请准时到场,钱准备好!~");
OnPublisher ();
}
}
}
class A {
public static void ReceiverMarryMessage () {
Console.WriteLine ("好的,蛇哥,我准时到!~");
}
}
class B {
public static void ReceiverMarryMessage () {
Console.WriteLine ("行行行,去!~");
}
}
class MainClass {
public static void Main (string[] args) {
// 实例化发起者
SendMarryMessageMa sm = new SendMarryMessageMa ();
// 绑定订阅者
sm.OnPublisher += A.ReceiverMarryMessage;
sm.OnPublisher += B.ReceiverMarryMessage;
// 执行
sm.Marry ();
}
}
}
题:烧水,当水温度大于95度的时候,报警器应该报警
using System;
namespace 练习
{
//声明一个委托
public delegate void HotEventHandler(int tem);
public class Water
{
//关联委托事件
public static event HotEventHandler temperature;
//定义一个私有变量表示温度
private int t;
public void SendNotification(int tem){
if(temperature != null){
temperature (tem);
}
}
//烧水
public void Hot(){
for (; t < 100; t++) {
if (t >= 95) {
SendNotification (t);
}
}
}
}
}