自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#事件模型的一個實例

開發(fā) 后端
本文通過一個一個實例來介紹C#事件模型,供大家參考。

在.net設(shè)計開發(fā)過程中事件無疑是用的最多的,下面設(shè)計幾個類來理解CLR事件工作機制:

C#事件模型應(yīng)用場景:假設(shè)我設(shè)計一個送貨上門的服務(wù)程序,當要送貨時我將消息發(fā)送給送奶工或者郵遞員等。

在構(gòu)建應(yīng)用程序時,我們先設(shè)計一個名為GoodsManager的類型負責發(fā)送消息,為GoodsManager類型定義一個對外提供名為NewGoods的事件。其它類型如"Milk"、“NewsPaper”可以訂閱該事件。當GoodsManager接收到新的消息時,他將引發(fā)該事件,將消息分發(fā)給已訂閱事件的對象。各個對象則以自己期望的方式來處理消息。

  1. class Program     
  2.     {     
  3.         static void Main(string[] args)     
  4.         {     
  5.             GoodsManager gm = new GoodsManager();     
  6.             Milk milk = new Milk(gm);     
  7.             NewsPaper paper = new NewsPaper();     
  8.             paper.Register(gm);     
  9.             gm.SubmitGoods("Jacky","Lily","送貨上門");     
  10.     
  11.             Console.WriteLine("**************");     
  12.             //發(fā)生經(jīng)濟危機了取消Milk訂閱     
  13.             milk.UnRegister(gm);     
  14.             gm.SubmitGoods("lily""Peter""送貨上門");     
  15.             Console.ReadLine();     
  16.                  
  17.         }     
  18.     
  19.         /// < summary>     
  20.         /// 定義一個類型用于存放發(fā)送給事件接收者的附加信息     
  21.         /// < /summary>     
  22.         internal class NewGoodsEventArgs : EventArgs     
  23.         {     
  24.             private readonly String f_From, f_To, f_Desc;     
  25.             public NewGoodsEventArgs(String from,String to,String desc)     
  26.             {     
  27.                 f_From  = from;     
  28.                 f_To    = to;     
  29.                 f_Desc  = desc;     
  30.             }     
  31.             public String From { get { return f_From; } }     
  32.             public String To { get { return f_To; } }     
  33.             public String Desc { get { return f_Desc; } }     
  34.         }     
  35.              
  36.         //定義事件成員管理類     
  37.         internal class GoodsManager     
  38.         {     
  39.             //創(chuàng)建線程同步鎖的私有字段     
  40.             private readonly Object m_eventLock = new Object();     
  41.     
  42.             private EventHandler< NewGoodsEventArgs> m_NewGoods;     
  43.             //增加一個事件成員     
  44.             public event EventHandler< NewGoodsEventArgs> NewGoods     
  45.             {     
  46.                 //加私有鎖并向委托鏈表增加一個處理程序     
  47.                 add { lock (m_eventLock) { m_NewGoods += value; } }     
  48.                 //顯示實現(xiàn)Remove方法     
  49.                 remove { lock (m_eventLock) { m_NewGoods -= value; } }     
  50.             }     
  51.                  
  52.             //引發(fā)事件的方法,以通知訂閱者對像事件已發(fā)生。     
  53.             protected virtual void OnNewGoods(NewGoodsEventArgs e)     
  54.             {     
  55.                 EventHandler< NewGoodsEventArgs> temp = m_NewGoods;     
  56.                 if (temp != null)     
  57.                     temp(this,e);     
  58.             }     
  59.             //將輸入轉(zhuǎn)化為期望事件     
  60.             public void SubmitGoods(String from, String to, String desc)     
  61.             {     
  62.                 //構(gòu)個對象用來通知接受者信息     
  63.                 NewGoodsEventArgs e = new NewGoodsEventArgs(from,to,desc);     
  64.                 //調(diào)用虛方法通知事件已發(fā)生     
  65.                 OnNewGoods(e);     
  66.             }     
  67.         }     
  68.     
  69.             
  70.         //監(jiān)聽事件的類型     
  71.         internal sealed class Milk     
  72.         {     
  73.             public Milk() { }     
  74.             public Milk(GoodsManager gm)     
  75.             {     
  76.                 gm.NewGoods += new EventHandler< NewGoodsEventArgs>(Milk_NewGoods);     
  77.             }     
  78.     
  79.             //當新的物品送到時執(zhí)行此方法     
  80.             void Milk_NewGoods(object sender, NewGoodsEventArgs e)     
  81.             {     
  82.                 Console.WriteLine("Accept Milk");     
  83.                 Console.WriteLine("From:{0},To:{1},desc:{2}",e.From,e.To,e.Desc);     
  84.             }     
  85.     
  86.             public void UnRegister(GoodsManager gm)//注銷事件     
  87.             {     
  88.                 gm.NewGoods -= Milk_NewGoods;     
  89.             }     
  90.             public void Register(GoodsManager gm) //訂閱事件     
  91.             {     
  92.                 gm.NewGoods += Milk_NewGoods;     
  93.             }     
  94.         }     
  95.     
  96.         internal sealed class NewsPaper     
  97.         {     
  98.             public NewsPaper() { }     
  99.             public NewsPaper(GoodsManager gm)     
  100.             {     
  101.                 gm.NewGoods += new EventHandler< NewGoodsEventArgs>(Milk_NewGoods);     
  102.             }     
  103.             void Milk_NewGoods(object sender, NewGoodsEventArgs e)     
  104.             {     
  105.                 Console.WriteLine("Accept News Paper");     
  106.                 Console.WriteLine("From:{0},To:{1},desc:{2}", e.From, e.To, e.Desc);     
  107.             }     
  108.             public void UnRegister(GoodsManager gm)     
  109.             {     
  110.                 gm.NewGoods -= Milk_NewGoods;     
  111.             }     
  112.             public void Register(GoodsManager gm)     
  113.             {     
  114.                 gm.NewGoods += Milk_NewGoods;     
  115.             }     
  116.         }     
  117.     }   

C#事件模型執(zhí)行結(jié)果:

執(zhí)行結(jié)果 

C#事件模型的例子就介紹到這里。

【編輯推薦】

  1. C# winForm自定義鼠標樣式的兩種方法
  2. C#自定義消息框的設(shè)置圖解
  3. 掌握C#自定義泛型類:從初始化說起
  4. C#存儲過程的循序漸進
  5. 存儲過程的優(yōu)勢及其調(diào)用方法介紹

 

責任編輯:book05 來源: csdn
相關(guān)推薦

2009-07-30 18:18:27

C#時間計算

2009-09-01 16:14:06

C#窗口抖動

2009-08-31 14:01:50

C#創(chuàng)建一個文件

2009-10-09 09:07:40

C#委托和事件

2009-09-03 16:38:49

C#回車鍵事件

2009-09-09 12:55:59

C# TextBox事

2009-07-22 17:15:04

C#實現(xiàn)

2024-05-14 08:03:51

C#EventArgs?屬性

2009-08-19 14:15:42

C# 復合控件

2009-08-05 16:04:27

C# Actor模型

2011-09-16 10:00:56

C++

2011-07-18 10:45:55

C#SQL Server數(shù)

2009-08-26 15:53:42

C#數(shù)據(jù)訪問XML

2009-08-25 01:46:00

C# WINDOWS服

2011-07-18 10:01:59

C# ADO.NETSQL Server數(shù)

2009-08-18 10:48:25

C#事件

2009-09-11 09:11:09

2009-08-25 15:23:16

C#子線程

2009-09-01 16:03:32

C#單元測試

2009-08-31 13:53:03

C#創(chuàng)建一個文件
點贊
收藏

51CTO技術(shù)棧公眾號