2013-04-01 79 views
2

我想知道c#中事件的確切用途是什麼。我仍然在學習c#的過程中,所以我可能會錯過一些東西,但是可以使用代表。
在這個例子中,我編寫了一個類,其方法的計數範圍是從0到2^64,每次達到一千個倍數時都會引發一個事件。下面是代碼:在c中使用事件關鍵字#

namespace EventDelegate 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     EventRaiserClass _eventraiser = new EventRaiserClass(); 
     _eventraiser.handler = SomeEventHandler; 
     _eventraiser.handler += AnotherEventHandler; 
     _eventraiser.Loop(); 
     Console.Read(); 
    } 

    static void SomeEventHandler(object sender, EventArgs args) 
    { 
     Console.WriteLine("Event raised"); 
    } 

    static void AnotherEventHandler(object sendr, EventArgs args) 
    { 
     Console.WriteLine("Event raised (Another handler)"); 
    } 
} 

public delegate void Handler(object sender, EventArgs args); 

class EventRaiserClass 
{ 
    public Handler handler; 
    public void Loop() 
    { 
     for (long i = 0; i < Int64.MaxValue; i++) 
     { 
      if ((i % 1000) == 0) 
      { 
       EventArgs args = new EventArgs(); 
       RaiseEvent(args); 
       System.Threading.Thread.Sleep(1000); 
      } 
     } 
    } 

    private void RaiseEvent(EventArgs args) 
    { 
     if (handler != null) 
      handler(this, args); 
    } 
} 

}

什麼會區別已經如果我宣佈了handler委託變量是這樣public event Handler handler的事件。
對不起,如果我有點模糊或缺少一些明顯的東西,但我只是想知道在使用event而不是使用後面發生的其他事情是否會發生,而不僅僅是爲了便於閱讀。

+1

可能重複(http://stackoverflow.com/questions/803242/understanding-events-and-event-handlers-in-c-sharp) –

+3

查看http://csharpindepth.com/Articles/Chapter2/Events.aspx –

+0

謝謝,我來看看。 –

回答

2

活動和代表非常相似,但事件受到更多限制,原因很充分。

在你的代碼中,你可以從外面用_eventraiser.handler做各種事情。儘管如此,你不應該做大部分的事情。

考慮這條線:

_eventraiser.handler = SomeEventHandler; 

如果你使用的代表,你就必須檢查每一個嘗試,如果委託是null附加的事件處理程序的時間,然後用=初始化它,如果它是不是null,你只需要處理程序與+=。如果你忘記了一個初始化,你會得到一個空引用異常,如果你輸入太多,你會覆蓋所有以前的東西。

如果您在本示例中使用事件而不是委託,則不必執行任何操作,實際上甚至不能執行此操作。與代表你甚至可以把它,然後傳遞給其他類,這可能是非常危險的。

Invoke也是如此,以及您可以對委託人執行的所有其他操作:它們不適用於事件。外部課程中唯一可以做的事情是+=-=,就是這樣。您可以將它們視爲具有特殊公共接口的代理人,並具有複雜的getter和setter。

(活動也有專門的addremove語法,但是這是一個相當不常用的功能)瞭解事件和事件處理程序在C#]的

+0

感謝您的幫助。我回到代碼,並委託一個事件之後,我在這一行'_eventraiser.handler = SomeEventHandler;'這會嘗試覆蓋所有以前訂閱的方法錯誤。 :-) –