委托和事件


  

  委托:其实就是一种命令,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);
				}
			}
		}

	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值