C# 用C语言转发事件#
我正在使用一个类来转发C#中的事件。我想知道有没有办法 它需要更少的代码开销 这是我到目前为止的一个例子C# 用C语言转发事件#,c#,events,event-handling,c#-2.0,C#,Events,Event Handling,C# 2.0,我正在使用一个类来转发C#中的事件。我想知道有没有办法 它需要更少的代码开销 这是我到目前为止的一个例子 class A { public event EventType EventA; } class B { A m_A = new A(); public event EventType EventB; public B() { m_A.EventA += OnEventA; } public void OnEventA() {
class A
{
public event EventType EventA;
}
class B
{
A m_A = new A();
public event EventType EventB;
public B()
{
m_A.EventA += OnEventA;
}
public void OnEventA()
{
if( EventB )
{
EventB();
}
}
}
类引发原始事件。类B将其转发为EventB(本质上是相同的事件)。类A对其他模块隐藏,因此它们无法直接订阅EventA
我试图做的是减少类B中用于转发事件的代码开销,因为类B中通常没有真正的事件处理。此外,我将有几个不同的事件,因此需要在类B中编写大量只用于转发事件的OneEvent()方法
是否有可能以某种方式自动将EventA链接到EventB,因此我会有如下内容:
class B
{
A m_A = new A();
public event EventType EventB;
public B()
{
m_A.EventA += EventB; // EventA automatically raises EventB.
}
}
顺便说一句,我使用的是C#2.0编译器。绝对:
class B
{
private A m_a = new A();
public event EventType EventB
{
add { m_a.EventA += value; }
remove { m_a.EventA -= value; }
}
}
换句话说,EventB订阅/取消订阅代码只是将订阅/取消订阅请求传递给EventA
但是,请注意,这不允许仅为订阅EventB的订阅者引发事件。这就像是将某人的地址直接传递给大众营销公司,而你最初的方式更像是自己订阅大众营销公司,允许人们要求你向他们发送邮件副本。IMO,你的原始代码(或多或少)是正确的。特别是,它允许您提供正确的
发送者
(对于认为自己正在订阅B
上的事件的人,应该是B
实例)
如果未订阅事件,有一些技巧可以减少运行时的开销,但这会添加更多代码:
这确实意味着
B.EventB
的订阅者得到了错误的发送者(a
而不是B
),但是-这可能很重要…真的,真的。。。当然,这取决于你认为什么是“错误的”。可能至少值得记录。如果你不关心发件人,那么这个模式是一个很好的问题,特别是因为你不应该忘记取消订阅EventA,否则可能会出现内存泄漏(你的对象B将保留在内存中,只要a是,即使它不再需要)。嗨,马克,我可以删除吗OnEventB方法中的“object sender”?object sender似乎是EventType的委托签名,而不是OnEventB方法?我意识到我无法删除第一个参数,因为它将被分配给m_A.EventA,我错了。
class B {
A m_A = new A();
private EventType eventB;
public event EventType EventB {
add { // only subscribe when we have a subscriber ourselves
bool first = eventB == null;
eventB += value;
if(first && eventB != null) m_A.EventA += OnEventB;
}
remove { // unsubscribe if we have no more subscribers
eventB -= value;
if(eventB == null) m_A.EventA -= OnEventB;
}
}
protected void OnEventB(object sender, EventArgsType args) {
eventB?.Invoke(this, args); // note "this", not "sender"
}
}