<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      【More Effective C#】?jī)H聲明非虛的事件

      2010-10-13 08:17  空逸云  閱讀(440)  評(píng)論(0)    收藏  舉報(bào)

      C#除了可以聲明虛方法,屬性外,也可以聲明虛事件.但是并不建議使用虛事件.因?yàn)檫@常會(huì)帶來(lái)不可預(yù)測(cè)的Bug.我們定義了一個(gè)WorkerEngine類(lèi).它有一個(gè)虛事件.

       


      public abstract class WorkerEngineBase
          {
              
      public virtual event EventHandler<WorkerEventArgs> OnProgress;
              
      public void DoLotsOfStuff()
              {
                  OnProgress
      +=new EventHandler<WorkerEventArgs>(WorkerEngineBase_OnProgress);
                  WorkerEventArgs args 
      = new WorkerEventArgs();
                  args.Percent 
      = 2;
                  EventHandler
      <WorkerEventArgs> progHandler = OnProgress;
                  
      if (progHandler != null)
                  {
                      progHandler(
      this, args);
                  }
                  
      if (args.Cancel)
                      
      return;
              }
              
      void WorkerEngineBase_OnProgress(object sender, WorkerEventArgs e)
              {
                  Console.WriteLine(
      "WorkerEngineBase class event.");
              }
              
      protected abstract void SomeWork();
          }

          
      public class WorkerEventArgs : EventArgs
          {
              
      public int Percent { getset; }
              
      public bool Cancel { getset; }
          }

       

       C#3.0.編譯器將會(huì)自動(dòng)創(chuàng)建私有字段,以及公共addremove方法.

       


          Private EventHandler
      <WorkerEventArgs>progressEvent;
          Public 
      virtual event EventHandler<WorkerEventArgs>OnOrigress
          {
          Add
          {
          progressEvent
      +=value;
          }
          Remove
          {
          progressEvent
      -=value;
          }
          }

       

        由于該私有字段是編譯器生成的.所以你無(wú)法通過(guò)代碼訪(fǎng)問(wèn).而且,派生事件將隱藏基類(lèi)中的事件,派生類(lèi)所作的工作與原始版本完全一致.即基類(lèi)有一個(gè)自己的私有委托字段,派生類(lèi)自己也有一個(gè).兩個(gè)互不相干.

       


      public class WorkerEngineDerived : WorkerEngineBase
          {
              
      protected override void SomeWork()
              {
                  
      //...do some thing;
              }

              
      public override event EventHandler<WorkerEventArgs> OnProgress;
          }
          
          
      //調(diào)用
      WorkerEngineDerived worker = new WorkerEngineDerived();
      worker.DoLotsOfStuff();

       

       結(jié)果并不與我們所想象的一致.

       

      這里如前面所說(shuō).派生類(lèi)訪(fǎng)問(wèn)的事件是派生類(lèi)自己的事件.而非基類(lèi)的事件..如果對(duì)派生類(lèi)事件賦值.那么基類(lèi)中的隱藏私有字段將不會(huì)得到賦值.其他類(lèi)型訂閱到的是派生類(lèi)中的事件.解決的方案是基類(lèi)使用類(lèi)似字段方式聲明的事件.

       


      public class WorkerEngineDerived : WorkerEngineBase
          {
              
      protected override void SomeWork()
              {
                  
      //...do some thing;
              }

              
      public override event EventHandler<WorkerEventArgs> OnProgress
              {
                  add
                  {
                      
      base.OnProgress += value;
                  }
                  remove { 
      base.OnProgress -= value; }
              }
          }

       

       子類(lèi)以屬性的方式重寫(xiě).那么結(jié)果很顯然便是我們所期望的

       

      在創(chuàng)建虛事件時(shí),不要使用字段方式的語(yǔ)法,而應(yīng)該采用屬性式的語(yǔ)法.

      我們也可以創(chuàng)建一個(gè)虛方法,在定義虛事件后調(diào)用該方法觸發(fā),所有的派生類(lèi)必須重寫(xiě)觸發(fā)事件的方法以及虛事件.

       


      public abstract class WorkerEngineBase
          {
              
      public virtual event EventHandler<WorkerEventArgs> OnProgress;

              
      protected virtual WorkerEventArgs RaiseEvent(WorkerEventArgs args)
              {
                  EventHandler
      <WorkerEventArgs> progHandler = OnProgress;
                  
      if (progHandler != null)
                      progHandler(
      this, args);
                  
      return args;
              }

              
      public void DoLotsOfStuff()
              {
                  OnProgress 
      += new EventHandler<WorkerEventArgs>(WorkerEngineBase_OnProgress);
                  WorkerEventArgs args 
      = new WorkerEventArgs();
                  args.Percent 
      = 2;
                  RaiseEvent(args);
                  
      if (args.Cancel)
                      
      return;
              }

              
      void WorkerEngineBase_OnProgress(object sender, WorkerEventArgs e)
              {
                  Console.WriteLine(
      "WorkerEngineBase class event.");
              }

              
      protected abstract void SomeWork();
          }
          
       
      public class WorkerEngineDerived : WorkerEngineBase
          {
              
      protected override void SomeWork()
              {
                  
      //...do some thing;
              }

              
      public override event EventHandler<WorkerEventArgs> OnProgress;

              
      protected override WorkerEventArgs RaiseEvent(WorkerEventArgs args)
              {
                  EventHandler
      <WorkerEventArgs> proghandler = OnProgress;
                  
      if (proghandler != null)
                      proghandler(
      this, args);
                  
      return args;
              }
          }

       

      主站蜘蛛池模板: 国产精品人妻| 亚洲精品无码成人A片九色播放 | 免费无码观看的AV在线播放| 鄂托克前旗| 成全高清在线播放电视剧| 人妻18毛片A级毛片免费看| 久久精品国产福利一区二区| 久久亚洲av成人一二三区| 三级国产三级在线| 亚洲大尺度一区二区av| 亚洲色大成网站WWW永久麻豆| 亚洲av成人免费在线| 精品久久精品午夜精品久久| 色伦专区97中文字幕| 丁香婷婷综合激情五月色| 国产精品视频亚洲二区| 阳江市| 国产精品亚洲综合久久小说| 亚洲欧美成人久久综合中文网| 亚洲AV高清一区二区三区尤物| 亚洲欧洲精品日韩av| 和政县| 亚洲成熟女人av在线观看| 国产精品高清一区二区三区| 亚洲高清有码中文字| 中文字幕人妻日韩精品| 新丰县| 久久96热在精品国产高清| 成人网站国产在线视频内射视频| 18禁无遮挡啪啪无码网站破解版| 18禁精品一区二区三区| 亚洲无av码一区二区三区| 年轻女教师hd中字3| 日韩人妻无码精品久久| 国产成人精品成人a在线观看| 精品视频在线观看免费观看| 亚洲一区二区精品偷拍| 亚洲不卡一区二区在线看| 777米奇影视第四色| 色综合视频一区二区三区 | 日韩av一区二区精品不卡|