国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#事件實例詳解

2020-01-24 00:36:58
字體:
來源:轉載
供稿:網友

C#事件實例詳解

C#和JAVA有許多相似的地方,設計思想差不多,語法及其相像,均傳承自面向對象設計思想,靈感來自C++并取其精華去其“糟粕(二字持保留意見)”,中間語言、解釋執行、一次編譯、到處執行,出身豪門算得上是表兄弟關系,各自擁有龐大的擁躉,兩種語言在發展的道路上你追我趕相互借鑒相互學習相互滲透,至于誰的IDE更強大對于一個用了二十年vim編輯器的人來說實在無從評判,強大到讓人內牛滿面~

    C#語言中關于事件(event)結合代理(delegate)實現對象狀態變更時的通知機制,總感覺這種處理有點過于復雜化了,但既然人家這么設計必定有人家的道理,相信并向人家學習而不急于批判和否定才能讓自己進步的更快,個人覺得這種處理大概是來自于視窗系統獨有的對各個控件事件集中快速響應的機制吧,這可能也是從事前后端開發關注點的差異,前端重人機交互當然交互的核心就是不確定時間屬性和狀態的事件,后端重觸發每個事件的發生基本都是預定義且流程化構建好的,所以接下來嘗試理解和解讀一下C#的事件。

    第一步:聲明一個代理,這個代理可以是系統的也可以是自定義的。

 public delegate void MyDelegate();                   // 聲明無參無返回值代理  public delegate bool MyDelegate(int k, int v);         // 聲明有參有返回值代理

    第二步:創建一個包含該代理事件的對象,對象中調用代理實現事件的處理。

  public class MyArrayList : ArrayList  {    public event MyDelegate MyChanged;           // 聲明代理事件    public override void Add(object o)                // 覆蓋父類方法    {       base.Add(o);                              // 調用父類方法      OnChanged();                             // 調用事件函數    }    protected virtual void OnChanged()    {      if (null != MyChanged) MyChanged();        // 代理觸發事件    }  }

    第三步:創建一個類,將事件和代理綁定到一起,a、類構造時以包含代理事件對象作為入參,b、“+=”運算符實現綁定,c、在代理中傳入類成員函數。

 public class MyEvent  {    private MyArrayList list;    public MyEvent(MyArrayList l)    {      list = l;      list.MyChanged += new MyDelegate(ListChanged);    // 綁定事件    }    private void ListChanged()                           // 被綁定事件    {      System.Console.WriteLine("ListChanged ...");    }  }

    第四步:創建含有事件的類的實例,創建含有方法的類的實例。

  public class MyTest  {    public static void Main()    {      MyEvent me = new MyEvent(new MyArrarList());      me.Add("object_1");    }  }

    仔細研究發現,代理相當于C/C++中的函數指針,但功能更強大,使用更安全,代理實例在創建的時候,代理會把傳給它的參數傳給綁定的方法,而且代理可以通過“+=”運算符搭載更多的方法,下面是對比C/C++函數指針的用法。

  char* (*pFun)(char*) = NULL;  pFun = GtCodeUtf8ToGB2312;  char* pszData = (*pFun)("計算機");   char* GtCodeUtf8ToGB2312(char* pszUtf8)  {    char* pszGB2312 = NULL;    ......    return pszGB2312;  }

    再舉兩個C語言中典型的函數指針的例子:

    例一:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);其中第三個參數是一個函數地址,指向被創建線程的核心處理函數。

    例二:void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));其中最后一個參數也是一個函數地址,指向兩個元素對比計算函數。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 衡阳县| 临沂市| 临安市| 潍坊市| 青州市| 南投县| 新干县| 循化| 楚雄市| 吴江市| 张家界市| 苍南县| 玛曲县| 鹤庆县| 墨玉县| 扬州市| 淮南市| 卢龙县| 广河县| 靖江市| 醴陵市| 张北县| 昭苏县| 伊吾县| 太湖县| 施甸县| 杂多县| 郸城县| 武定县| 青龙| 巢湖市| 松潘县| 神池县| 广宁县| 仙桃市| 陕西省| 南开区| 章丘市| 塘沽区| 米林县| 衡阳市|