2012-07-31 178 views
0

我正在嘗試將兩個事件訂閱到一個對象。但是在我嘗試添加事件之前,對象沒有實例化。有沒有辦法我可以訂閱這兩個事件並事後實例化?我已經有代表,事件,事件參數和事件處理程序工作。C#事件訂閱方法

示例代碼:

Ares a; 

public B() 
{ 
    a.up += new upEventHandler(doUp); 
    a.down += new downEventHandler(doDown); 
    a = new Ares(); 
} 
+1

沒有,除非事件是靜態的。事件就像任何其他實例屬性:它們不能沒有實例就存在。 – ken 2012-07-31 17:25:46

+1

不是真的,除了實際的類對象之外,沒有真正的方法來存儲這些信息。 – 2012-07-31 17:25:54

+0

不,你不能和更多的點爲什麼你想要? – 2012-07-31 17:31:09

回答

3

我試圖訂閱兩個事件到一個對象。但是在我嘗試添加事件之前,對象沒有實例化。有沒有辦法我可以訂閱這兩個事件並事後實例化?

不,絕對不是。這就像在對象存在之前嘗試設置對象的屬性一樣。試着想想如何的工作 - 然後意識到訂閱的事件處理程序是屬性的一部分狀態的對象,就像屬性。

顯然你可以將事件處理程序存儲在其他地方並稍後訂閱它們,但如前所述,答案根本不是。它在概念層面或實際層面上沒有任何意義。

+0

@ user1221830快速瀏覽一下你的示例代碼將會告訴你到底你想要做什麼有什麼問題。 'a.up + = new upEventHandler(doUp);''a.up'是什麼?如果a尚未實例化,那麼程序不知道'a.up'是什麼,它的位置以及存儲的內容。如果'a.up'是一個int,那麼你不能'a.up + = 3;'如果你還沒有實例化'a',你能嗎? – 2012-07-31 17:29:16

+0

好,非常感謝您的建議。我最終只是將它們改爲靜態。 – user1221830 2012-07-31 18:21:03

1

這是不可能的。您必須首先實例化對象。

0

您可以對您所描述的內容做的最接近的事情是將事件變爲靜態。

class Ares { 
    public static event upEventHandler up; 
    public static event downEventHandler down; 
    // ... 
} 

然後修改B()是:

public B() { 
    Ares.up += new upEventHandler(doUp); 
    Ares.down += new downEventHandler(doDown); 
    a = new Ares(); 
} 
0

我假設事件是在構造解僱,你要拍攝。

嘗試重構事件觸發代碼出了構造成一個單獨的初始化()方法,這樣,那麼你將有以下:

Ares a; 

public B() 
{ 
    a = new Ares(); 
    a.up += new upEventHandler(doUp); 
    a.down += new downEventHandler(doDown); 

    a.Initialize(); //do all init of the ares object here, not in constructor 
}