av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

C#事件模型的一個(gè)實(shí)例

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

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

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

 
 
 
 
  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)濟(jì)危機(jī)了取消Milk訂閱   
  13.             milk.UnRegister(gm);   
  14.             gm.SubmitGoods("lily", "Peter", "送貨上門");   
  15.             Console.ReadLine();   
  16.                
  17.         }   
  18.   
  19.         /// < summary>   
  20.         /// 定義一個(gè)類型用于存放發(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.             //增加一個(gè)事件成員   
  44.             public event EventHandler< NewGoodsEventArgs> NewGoods   
  45.             {   
  46.                 //加私有鎖并向委托鏈表增加一個(gè)處理程序   
  47.                 add { lock (m_eventLock) { m_NewGoods += value; } }   
  48.                 //顯示實(shí)現(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)個(gè)對象用來通知接受者信息   
  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.             //當(dāng)新的物品送到時(shí)執(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é)果:

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


分享題目:C#事件模型的一個(gè)實(shí)例
標(biāo)題URL:http://uogjgqi.cn/article/djjeecj.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流