众所周知,私有事件处理程序可以监听来自其他类的事件。(文档中的示例总是使用私有处理程序。)
事件处理程序只是调用事件的另一个类中的私有方法。因此,从其类外部调用处理程序会破坏封装性。或者我漏掉了什么?
完整代码示例:
class Caller {
public event EventHandler MyEvent;
public void RaiseMyEvent()
{
MyEvent(this, EventArgs.Empty);
}
}
class Receiver
{
private void MyPrivateHandler(Object sender, EventArgs e)
{
Console.WriteLine("I'm a private method!");
}
public void Subscribe(Caller caller)
{
caller.MyEvent += this.MyPrivateHandler;
}
}
在订阅后,
receiver.Subscribe(caller);
我们可以轻松地从外部调用receiver
类中的私有方法:caller.RaiseMyEvent();
。这是一个纯粹的学术问题,甚至是教条主义的问题。此外,我个人认为这个特性非常方便、实用,而且真的很喜欢它。这真的很酷:我们可以明确授予其他类调用我们的私有方法的权利。(我们还可以取消订阅并使用委托和事件做很多有趣的事情。)无论如何,它仍然违反了封装的纯度...或者没有呢?附注:感谢Matthew Watson指出以下细微差别:当订阅事件时,私有处理程序只能被该事件专属调用。而如果我们将其设为公共(或通过公共包装器方法调用),任何人都可以调用它。这在可访问性上有很大的区别。
另外,是的-我从来没有在教科书中看到这个问题。如果你知道一本,请留下参考资料。
Receiver
类外部不可观察。除了使用反射之外,没有其他类可以直接调用MyPrivateHandler
。 - Matthew Watson