C#事件订阅方法

问题描述:

我正在尝试将两个事件订阅到一个对象。但是在我尝试添加事件之前,对象没有实例化。有没有办法我可以订阅这两个事件并事后实例化?我已经有代表,事件,事件参数和事件处理程序工作。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

我试图订阅两个事件到一个对象。但是在我尝试添加事件之前,对象没有实例化。有没有办法我可以订阅这两个事件并事后实例化?

不,绝对不是。这就像在对象存在之前尝试设置对象的属性一样。试着想想如何的工作 - 然后意识到订阅的事件处理程序是属性的一部分状态的对象,就像属性。

显然你可以将事件处理程序存储在其他地方并稍后订阅它们,但如前所述,答案根本不是。它在概念层面或实际层面上没有任何意义。

+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

这是不可能的。您必须首先实例化对象。

您可以对您所描述的内容做的最接近的事情是将事件变为静态。

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(); 
} 

我假设事件是在构造解雇,你要拍摄。

尝试重构事件触发代码出了构造成一个单独的初始化()方法,这样,那么你将有以下:

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 
}