共用方式為


事件 (C# 與 Java 的比較)

更新:2007 年 11 月

事件是類別在物件上發生值得注意的資訊時 (例如在圖形化使用者介面中按一下控制項),通知物件使用者的方法。這種通知便稱為引發事件。引發事件的物件稱為事件的來源或傳送者。

不像在 Java 中是由實作自訂接聽程式類別執行事件處理,C# 程式開發人員能夠使用委派 (Delegate) 來處理事件。委派是封裝方法的一種型別,一旦以方法初始化委派,則該委派的行為便會與該方法完全相同,而且還能透過 () 運算子叫用。它類似於 C++ 函式指標,但為型別安全。

委派可以當做其他任何方法一般使用,也有參數和傳回值,如下列範例所示:

public delegate int ReturnResult(int x, int y);

如需委派的詳細資訊,請參閱委派 (C# 程式設計手冊)

事件與方法類似,同樣也有包括名稱和參數清單的簽章。這個簽章是由委派型別定義,例如:

public delegate void MyEventHandler(object sender, System.EventArgs e);

在 Windows 使用者介面程式設計中,經常會擁有第一個參數做為參考事件來源的物件,第二個參數則做為持有與事件相關資料的物件。不過,C# 語言並不會要求或強制使用這種設計,只要傳回的是虛值,事件簽章便與任何有效委派簽章一樣。

可以使用 event 關鍵字來宣告事件,如這個範例所示:

public event MyEventHandler TriggerIt;

若要觸發事件,在引發事件時請定義要叫用的方法,如這個範例所示:

public void Trigger()
{
    TriggerIt();
}

若要引發事件,請呼叫委派,並傳遞與事件相關的參數。接著委派會呼叫已加入事件的所有處理常式。每個事件都可以指定多個處理常式來接收事件。在這個情況下,事件會自動呼叫每個接收者。不論接收者的數目有多少,引發事件只需要對事件呼叫一次。

如果您希望類別接收事件,請使用 += 運算子將委派加入至事件,以訂閱該事件,例如:

myEvent.TriggerIt += myEvent.MyMethod;

若要取消訂閱事件,請使用 -= 運算子從事件中移除委派,例如:

myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod);

如需事件的詳細資訊,請參閱事件 (C# 程式設計手冊)

注意事項:

在 C# 2.0 中,委派可以封裝具名方法和匿名方法。如需匿名方法的詳細資訊,請參閱匿名方法 (C# 程式設計手冊)

範例

說明

下列程式碼範例會使用與其關聯的三個方法來定義事件。當觸發事件時就會執行方法。然後事件中就會移除一個方法,並且再次觸發事件。

程式碼

// Declare the delegate handler for the event:
public delegate void MyEventHandler();

class TestEvent
{
    // Declare the event implemented by MyEventHandler.
    public event MyEventHandler TriggerIt;

    // Declare a method that triggers the event:
    public void Trigger()
    {
        TriggerIt();
    }
    // Declare the methods that will be associated with the TriggerIt event.
    public void MyMethod1()
    {
        System.Console.WriteLine("Hello!");
    }
    public void MyMethod2()
    {
        System.Console.WriteLine("Hello again!");
    }
    public void MyMethod3()
    {
        System.Console.WriteLine("Good-bye!");
    }

    static void Main()
    {
        // Create an instance of the TestEvent class.
        TestEvent myEvent = new TestEvent();

        // Subscribe to the event by associating the handlers with the events:
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod1);
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod2);
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod3);
        // Trigger the event:
        myEvent.Trigger();

        // Unsuscribe from the the event by removing the handler from the event:
        myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod2);
        System.Console.WriteLine("\"Hello again!\" unsubscribed from the event."); 

        // Trigger the new event:
        myEvent.Trigger();
    }
}

輸出

Hello!
Hello again!
Good-bye!
"Hello again!" unsubscribed from the event.
Hello!
Good-bye!

請參閱

概念

C# 程式設計手冊

參考

event (C# 參考)

delegate (C# 參考)

其他資源

Java 開發人員可用的 C#