1. 程式人生 > 其它 >C#委託的釋出和訂閱

C#委託的釋出和訂閱

技術標籤:c#

using System;

namespace 委託的釋出和訂閱
{
    class Program
    {
        /*
         背景:由於委託能引用方法,且能連結和刪除其他委託物件
         步驟:
            ①定義委託型別,並在釋出者類中定義一個型別的共有成員
            ②在訂閱者類中定義委託處理方法
            ③訂閱者物件將其事件處理方法連結到釋出者物件的委託成員(一個委託型別的引用)上。
            ④釋出者物件在特定的情況下“激發”委託操作,從而自動呼叫訂閱者物件的委託處理方法、
         */
static void Main(string[] args) { //建立學校鈴聲類 SchoolRing sr = new SchoolRing(); //建立學生例項 Students students = new Students(); //訂閱鈴聲委託 students.SubscribeToRing(sr); Console.WriteLine("請輸入大鈴聲引數(1:表示上課鈴;2:表示下課鈴):"
); //打鈴動作 sr.Jow(Convert.ToInt32(Console.ReadLine())); Console.ReadLine(); } } /// <summary> /// 宣告一個委託型別 /// </summary> /// <param name="ringKind">表示鈴聲種類(1 表示上課鈴聲;2 表示下課鈴聲)</param> public delegate void RingEvent
(int ringKind); public class SchoolRing { public event RingEvent OnBellSound;//委託釋出 //(插入知識點:新增event 以保證事件訂閱可靠性,在釋出委託的定義中加上event) //讀取輸入,並且做出判斷 public void Jow(int ringKind) { if (ringKind ==1 || ringKind ==2) { Console.Write(ringKind == 1 ? "上課鈴響了," : "下課鈴響了"); if (OnBellSound !=null) {//不等於空,說明它已訂閱了具體的方法 OnBellSound(ringKind);//回撥OnBellSound委託所訂閱(引用)的具體方法 } } else { Console.WriteLine("這個鈴聲引數不正確!"); } } } public class Students { //學生訂閱鈴聲這個委事件 public void SubscribeToRing(SchoolRing schoolRing) { schoolRing.OnBellSound += SchoolJow; } //與上面關聯--執行事件 private void SchoolJow(int ringKind) { if (ringKind ==2) { Console.WriteLine("同學們開始課間休息"); } else if(ringKind ==1) { Console.WriteLine("同學們開始認真學習"); } } //取消訂閱鈴聲動作 public void CancelSubscribe(SchoolRing schoolRing) { schoolRing.OnBellSound -= SchoolJow; } } }