最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C#之事件

 更新時間:2020年06月04日 11:28:21   作者:千金不如一默  
這篇文章主要介紹了C#之事件的知識點,文中代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以參考下

事件:定義了事件成員的類允許通知其他其他對象發(fā)生了特定的事情。具體的說,定義了事件成員的類能提供以下功能

1.方法能登記它對事件的關注

2.方法能注銷它對事件的關注

3.事件發(fā)生時,登記了的方法將收到通知

類型之所以能提供事件通知功能,是因為類型維護了一個已登記方法的列表。事件發(fā)生后,類型將通知列表中所有已登記的方法。

事件是以委托為基礎。委托是調用回調方法的一種類型安全的方式。對象憑借回調方法接收他們訂閱的通知。

假如有一下場景:要設計一個電子郵件程序。當有新的郵件的到達時,用戶希望做些一別的操作,例如轉發(fā)給其他人或其他想實現(xiàn)的功能。事件在其中起到的就是一個通知的作用,告訴其他對象有新的郵件到達了,可以做XXX事情了。

下面使用事件實現(xiàn)這個功能

1.定義一個附加信息類,用來通知接收者發(fā)生了什么。

/// <summary>
  /// 事件附加消息
  /// </summary>
  public class NewMailEventArgs:EventArgs{
    private readonly string m_from,m_to,m_subject;
    public NewMailEventArgs(string from,string to,string subject){
      m_from=from;
      m_to=to;
      m_subject=subject;
    }
    // 發(fā)件人
    public string From { get{return m_from;} }
    // 接收人
    public string To { get{return m_to;} }
    // 主題
    public string Subject{get{return m_subject;}}
  }

附加信息類繼承了EventArgs,這個基類只定義了一個空的信息,在沒有附加信息時可直接使用EventArgs.Empty。EventArgs類的源代碼

namespace System
{
  //
  // Summary:
  //   Represents the base class for classes that contain event data, and provides a
  //   value to use for events that do not include event data.
  public class EventArgs
  {
    //
    // Summary:
    //   Provides a value to use with events that do not have event data.
    public static readonly EventArgs Empty;

    //
    // Summary:
    //   Initializes a new instance of the System.EventArgs class.
    public EventArgs();
  }
}

2.定義事件成員

事件成員使用C#關鍵字event定義。每個事件成員都要指定以下內容:可訪問標識符public(因為只有publi才能使其他對象訪問),委托類型以及名稱。

 public class MailManager{
    // 定義事件成員
    public event EventHandler<NewMailEventArgs> NewMail;
    
  }

它的類型是EventHandler<NewMailEventArgs> 這意味著事件通知的所有接收者都必須有一個和這個類型匹配的回調方法。System.EventHandler的委托定義類型如下:

namespace System
{
  //
  // Summary:
  //   Represents the method that will handle an event when the event provides data.
  //
  // Parameters:
  //  sender:
  //   The source of the event.
  //
  //  e:
  //   An object that contains the event data.
  //
  // Type parameters:
  //  TEventArgs:
  //   The type of the event data generated by the event.
  public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
}

所以接收者必須提供的方法必須是一下形式:

void MethodName(Object sender,NewMailEventArgs e);

3. 定義負責引發(fā)事件的方法來通知事件的登記對象

public class MailManager{
    // 定義事件成員
    public event EventHandler<NewMailEventArgs> NewMail;
    // 定義負責引發(fā)事件的方法來通知已登記的對象
    protected virtual void OnNewMail(NewMailEventArgs e){
      // 將字段復制到一個臨時變量,避免多線程情況中這個成員被移除
      EventHandler<NewMailEventArgs> temp=Volatile.Read(ref NewMail);
      if(temp!=null) temp(this,e);
    }

    // 接受附加信息并調用引發(fā)事件的方法來通知所有登記的對象
    public void SimulateNewMail(string from,string to,string subject){
      NewMailEventArgs e=new NewMailEventArgs(from,to,subject);
      OnNewMail(e);
    }
  }

4. 定義事件接收者

public class Fax{
    public Fax(MailManager mm){
      // 構造委托實例,向事件登記回調方法
      mm.NewMail+=FaxMsg;
    }
    /// <summary>
    /// 回調方法
    /// </summary>
    /// <param name="sender">表示MailManager對象,便于將信息傳遞給他</param>
    /// <param name="e">表示MailManager對象想傳給我們的附加信息</param>
    private void FaxMsg(object sender,NewMailEventArgs e){
      Console.WriteLine("msg:{0},{1},{2}",e.From,e.To,e.Subject);
    }

    /// <summary>
    /// 注銷對事件的登記
    /// </summary>
    /// <param name="mm"></param>
    public void Unregister(MailManager mm){
      mm.NewMail-=FaxMsg;
    }
  }

對象不在接收事件通知時應注銷對事件的關注。因為對象只要向事件等急了它的一個方法,便不能被垃圾回收。

5. 程序初始化時應首先構造MailManager對象,將指向它的變量傳遞給Fax。在Fax構造器中添加對事件的關注。最后調用MailManager對象的事件通知方法

static void Main(string[] args)
    {
      MailManager mm=new MailManager();
      Fax f=new Fax(mm);
      mm.SimulateNewMail("a","b","Hello World!");
      Console.ReadKey();
    }

控制臺輸出結果:以調用回調方法。

以上就是詳解C#之事件的詳細內容,更多關于C#之事件的資料請關注腳本之家其它相關文章!

相關文章

  • WPF利用TextBlock實現(xiàn)查找結果高亮顯示效果

    WPF利用TextBlock實現(xiàn)查找結果高亮顯示效果

    在應用開發(fā)過程中,經(jīng)常遇到這樣的需求:通過關鍵字查找數(shù)據(jù),把帶有關鍵字的數(shù)據(jù)顯示出來,同時在結果中高亮顯示關鍵字,所以本文就來和大家介紹一下如何利用TextBlock實現(xiàn)查找結果高亮顯示效果吧
    2023-08-08
  • C#編程實現(xiàn)向并口設備發(fā)送指令、獲取并口設備的狀態(tài)

    C#編程實現(xiàn)向并口設備發(fā)送指令、獲取并口設備的狀態(tài)

    這篇文章主要介紹了C#編程實現(xiàn)向并口設備發(fā)送指令、獲取并口設備的狀態(tài),本文直接給出實例代碼,需要的朋友可以參考下
    2015-06-06
  • C#中的協(xié)變與逆變深入講解

    C#中的協(xié)變與逆變深入講解

    這篇文章主要給大家介紹了關于C#中協(xié)變與逆變的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • c# 可選參數(shù)、命名參數(shù)

    c# 可選參數(shù)、命名參數(shù)

    設計一個方法的參數(shù)的時,可為部分或全部參數(shù)分配默認值。調用其方法時,可以重新指定分配了默認值的參數(shù),也可以使用默認值
    2012-10-10
  • C#四舍五入用法實例

    C#四舍五入用法實例

    這篇文章主要為大家詳細介紹了C#四舍五入用法實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C#列表框、復選列表框、組合框的用法實例

    C#列表框、復選列表框、組合框的用法實例

    這篇文章主要介紹了C#列表框、復選列表框、組合框的用法,實例分析了在一個簡單存儲項目中列表框、復選列表框、組合框的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • C#中按字符串截取長字符串實例

    C#中按字符串截取長字符串實例

    這篇文章主要介紹了C#中按字符串截取長字符串的實現(xiàn)方法,以實例形式展示了C#中正則匹配截取字符串的技巧,需要的朋友可以參考下
    2014-11-11
  • C# 中使用正則表達式匹配字符的含義

    C# 中使用正則表達式匹配字符的含義

    正則表達式的作用用來描述字符串的特征。本文重點給大家介紹C# 中使用正則表達式匹配字符的含義,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-10-10
  • c# socket編程udp客戶端實現(xiàn)代碼分享

    c# socket編程udp客戶端實現(xiàn)代碼分享

    這篇文章主要介紹了c# socket編程實現(xiàn)udp客戶端,大家參考使用吧
    2013-12-12
  • C# WPF編程之命令模型詳解

    C# WPF編程之命令模型詳解

    這篇文章主要為大家詳細介紹了C# WPF編程中命令模型的相關知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以跟隨小編一起學習一下
    2024-04-04

最新評論

岳普湖县| 双峰县| 府谷县| 吴川市| 安宁市| 化州市| 平湖市| 尚义县| 大名县| 都安| 泸水县| 桃江县| 昌平区| 长治县| 凭祥市| 新平| 青浦区| 临桂县| 万荣县| 宜城市| 手机| 中山市| 仁布县| 罗城| 天津市| 宁武县| 睢宁县| 临沭县| 英德市| 广元市| 乐山市| 贵阳市| 盐亭县| 洱源县| 屏山县| 县级市| 晋州市| 耒阳市| 天长市| 绥棱县| 连山|