哪吒2之魔童闹海|哪吒2之魔童归来免费观看|哪吒2在线观看|哪吒2魔童闹海电影免费观看|哪吒2免费观看完整版大电影|哪吒1免费观看完整版

新疆軟件開發(fā)

本站首頁 軟件開發(fā) 成功案例 公司新聞 公司簡介 客服中心 軟件技術(shù) 網(wǎng)站建設(shè)
  您現(xiàn)在的位置: 新疆二域軟件開發(fā)公司 >> .Net技術(shù) >> 文章正文

.net學習:c#事件的深入分析

            事件(event),這個詞兒對于初學者來說,往往總是顯得有些神秘,不易弄懂。而這些東西卻往往又是編程中常用且非常重要的東西。大家都知道windows消息處理機制的重要,其實C#事件就是基于windows消息處理機制的,只是封裝的更好,讓開發(fā)者無須知道底層的消息處理機制,就可以開發(fā)出強大的基于事件的應用程序來。

             先來看看事件編程有哪些好處。
在以往我們編寫這類程序中,往往采用等待機制,為了等待某件事情的發(fā)生,需要不斷地檢測某些判斷變量,而引入事件編程后,大大簡化了這種過程:
- 使用事件,可以很方便地確定程序執(zhí)行順序。
- 當事件驅(qū)動程序等待事件時,它不占用很多資源。事件驅(qū)動程序與過程式程序最大的不同就在于,程序不再不停地檢查輸入設(shè)備,而是呆著不動,等待消息的到來,每個輸入的消息會被排進隊列,等待程序處理它。如果沒有消息在等待,則程序會把控制交回給操作系統(tǒng),以運行其他程序。
- 事件簡化了編程。操作系統(tǒng)只是簡單地將消息傳送給對象,由對象的事件驅(qū)動程序確定事件的處理方法。操作系統(tǒng)不必知道程序的內(nèi)部工作機制,只是需要知道如何與對象進行對話,也就是如何傳遞消息。

  有了這么多好處,看來我們的確有必要掌握它。俗話說:“難了不會,會了不難”。就讓我們一步一步開始吧...

  要講事件,必然要講到委托(delegate)。它們之間的關(guān)系可以通過一個淺顯的比方來說明,這個比方可能不是十分恰當。比如你要租一個房屋,這是一個事件,那么委托就是房屋租賃中介,當你把租房子的消息告知中介后,中介就會產(chǎn)生出一套符合你要求的房屋租賃方案來。再由中介執(zhí)行這套方案,你便租得了這個房屋,即事件被處理了。當然你也可以不通過中介,直接找房東,但如果沒有互聯(lián)網(wǎng)等工具,你如何得到誰出租房屋的信息?話題扯遠了。

委托(delegate)
委托可以理解成為函數(shù)指針,不同的是委托是面向?qū)ο,而且是類型安全的。關(guān)于委托的理解,可以參考我的另一篇文章《C#委托之個人理解》。

事件(event)
  我們可以把事件編程簡單地分成兩個部分:事件發(fā)生的類(書面上叫事件發(fā)生器)和事件接收處理的類。事件發(fā)生的類就是說在這個類中觸發(fā)了一個事件,但這個類并不知道哪個個對象或方法將會加收到并處理它觸發(fā)的事件。所需要的是在發(fā)送方和接收方之間存在一個媒介。這個媒介在.NET Framework中就是委托(delegate)。在事件接收處理的類中,我們需要有一個處理事件的方法。好了,我們就按照這個順序來實現(xiàn)一個捕獲鍵盤按鍵的程序,來一步一步說明如何編寫事件應用程序。

1、首先創(chuàng)建一個自己的EventArgs類。
引自MSDN:
EventArgs是包含事件數(shù)據(jù)的類的基類,此類不包含事件數(shù)據(jù),在事件引發(fā)時不向事件處理程序傳遞狀態(tài)信息的事件會使用此類。如果事件處理程序需要狀態(tài)信息,則應用程序必須從此類派生一個類來保存數(shù)據(jù)。
因為在我們鍵盤按鍵事件中要包含按鍵信息,所以要派生一個KeyEventArgs類,來保存按鍵信息,好讓后面知道按了哪個鍵。


internal class KeyEventArgs : EventArgs
{
    private char keyChar;
    public KeyEventArgs( char keyChar ) : base()
    {
        this.keyChar = keyChar;
    }

    public char KeyChar
    {
        get
        {
            return keyChar;
        }
    }
}
2、再創(chuàng)建一個事件發(fā)生的類KeyInputMonitor,這個類用于監(jiān)控鍵盤按鍵的輸入并觸發(fā)一個事件:
internal class KeyInputMonitor
{
    // 創(chuàng)建一個委托,返回類型為void,兩個參數(shù)
    public delegate void KeyDown( object sender, KeyEventArgs e );
    // 將創(chuàng)建的委托和特定事件關(guān)聯(lián),在這里特定的事件為OnKeyDown
    public event KeyDown OnKeyDown;

    public void Run()
    {
        bool finished = false;
        do
        {
            Console.WriteLine( "Input a char" );
            string response = Console.ReadLine();

            char responseChar = ( response == "" ) ? ' ' : char.ToUpper( response[0] );
            switch( responseChar )
            {
                case 'X':
                    finished = true;
                    break;
                default:
                    // 得到按鍵信息的參數(shù)
                    KeyEventArgs keyEventArgs = new KeyEventArgs( responseChar );
                    // 觸發(fā)事件
                    OnKeyDown( this, keyEventArgs );
                    break;
            }
        }while( !finished );
    }
}
這里注意OnKeyDown( this, KeyEventArgs );一句,這就是觸發(fā)事件的語句,并將事件交由KeyDown這個委托來處理,委托指定事件處理方法去處理事件,這就是事件接收方的類的事情了。參數(shù)this是指觸發(fā)事件的對象就是本身這個對象,keyEventArgs包含了按鍵信息。

3、最后創(chuàng)建一個事件接收方的類,這個類先產(chǎn)生一個委托實例,再把這個委托實例添加到產(chǎn)生事件對象的事件列表中去,這個過程又叫訂閱事件。然后提供一個方法回顯按鍵信息。
internal class EventReceiver
{
    public EventReceiver( KeyInputMonitor monitor )
    {
        // 產(chǎn)生一個委托實例并添加到KeyInputMonitor產(chǎn)生的事件列表中
        monitor.OnKeyDown += new KeyInputMonitor.KeyDown( this.Echo );
    }
    private void Echo(object sender, KeyEventArgs e)
    {
        // 真正的事件處理函數(shù)
        Console.WriteLine( "Capture key: {0}", e.KeyChar );
    }
}
4、看一下如何調(diào)用
public class MainEntryPoint
{
    public static void Start()
    {
        // 實例化一個事件發(fā)送器
        KeyInputMonitor monitor = new KeyInputMonitor();
        // 實例化一個事件接收器
        EventReceiver eventReceiver = new EventReceiver( monitor );
        // 運行
        monitor.Run();
    }
}
總結(jié):

C#中使用事件需要的步驟:
1.創(chuàng)建一個委托
2.將創(chuàng)建的委托與特定事件關(guān)聯(lián)(.Net類庫中的很多事件都是已經(jīng)定制好的,所以他們也就有相應的一個委托,在編寫關(guān)聯(lián)事件處理程序--也就是當有事件發(fā)生時我們要執(zhí)行的方法的時候我們需要和這個委托有相同的簽名)
3.編寫事件處理程序
4.利用編寫的事件處理程序生成一個委托實例
5.把這個委托實例添加到產(chǎn)生事件對象的事件列表中去,這個過程又叫訂閱事件

C#中事件產(chǎn)生和實現(xiàn)的流程:
1.定義A為產(chǎn)生事件的實例,a為A產(chǎn)生的一個事件
2.定義B為接收事件的實例,b為處理事件的方法
3.A由于用戶(程序編寫者或程序使用者)或者系統(tǒng)產(chǎn)生一個a事件(例如點擊一個Button,產(chǎn)生一個Click事件)
4.A通過事件列表中的委托對象將這個事件通知給B
5.B接到一個事件通知(實際是B.b利用委托來實現(xiàn)事件的接收)
6.調(diào)用B.b方法完成事件處理

不當之處,歡迎指正。
(完)

作者:未知 | 文章來源:cnblogs | 更新時間:2008-4-2 13:08:13

  • 上一篇文章:

  • 下一篇文章:

  • 相關(guān)文章:
    C#實現(xiàn)短信發(fā)送程序的例子
    基礎(chǔ)學習:java中使用存儲過程
    C#如何設(shè)置或者獲取目錄的權(quán)限?
    解析c#語言和java語言最相似的地方
    C#中如何才能調(diào)用QTP自動化對象
    C#如何轉(zhuǎn)換AVI文件為BMP位圖文件
    c#如何連接各類數(shù)據(jù)庫
    C#abstact interface 學習
    在VC 程序中自定義Vista事件日志
    c#中的interface abstract與virtual學習
    軟件技術(shù)
    · 開發(fā)語言
    · Java技術(shù)
    · .Net技術(shù)
    · 數(shù)據(jù)庫開發(fā)
    最新文章  
    ·.net技術(shù) asp.net MVC3 Vi
    ·.net將視頻文件格式轉(zhuǎn)換成
    ·NET Framework 2.0 Servic
    ·如何動態(tài)修改winform的app
    ·asp,net軟件結(jié)構(gòu)設(shè)計和相關(guān)
    ·學習怎樣使用ASP.NET中的虛
    ·,net基礎(chǔ)類的學習:system
    ·.net學習:c#事件的深入分
    ·Facade Pattern學習總結(jié)
    ·C#如何設(shè)置或者獲取目錄的
    ·如何使用XSL來定義ASP.NET
    ·理解WCF Data Contract契約
    ·如何能在.net2.0開發(fā)的控件
    ·模式怎樣使用,講解模式的
    ·如何解決Menu菜單被frame遮
    關(guān)于我們 | 軟件開發(fā) | 下載試用 | 客服中心 | 聯(lián)系我們 | 友情鏈接 | 網(wǎng)站地圖 | 新疆電子地圖 | RSS訂閱
    版權(quán)所有 © 2016 新疆二域軟件開發(fā)網(wǎng) www.pg11qqq.com All Rights Reserved 新ICP備14003571號
    新疆軟件開發(fā)總機:0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯(lián)大廈A-5C 郵編:830000