Col*_*son 7 c# delegates dispose operators variable-assignment
我班上有以下代码
public class Receiver : IReceiver
{
public event EventHandler Received;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (Received != null)
{
foreach (EventHandler delegateMember in Received.GetInvocationList())
{
Received -= delegateMember;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码的作用是,当我处理我的类时,任何连接到Received事件的事件都将被单独删除.
如果下面的简洁版本具有相同的效果,我一直想知道是否而不是如此冗长
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
Received = null;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,这归结为Microsoft在实现委托重载时如何创建运算符重载.我知道所有文档都说使用+ =来订阅,而= =取消订阅事件.我还看到该文档说当删除最后一个订阅者时,该事件将被指定为null.文档没有说的是将事件赋值为null,是否具有取消订阅所有事件的效果?
我很想知道这是否可行,如果有任何文档说明可能的简洁代码是正确的行为.
更新:
我一直在用c#编译器进行更多的挖掘,并发现null的赋值只能在定义事件的类中工作.+ =和 - =始终可以从课程内外获得.这使我认为使用= null版本是可以接受的.但是,这是猜测,我仍然没有看到任何明确说明这是支持功能的文档.
没有理由不在null这里分配给代表。
如果您在定义事件的类之外,您将无法直接进行分配。null对于任何使用该类的人来说,他们应该只关心自己的处理程序,他们可以添加或删除这些处理程序。他们无法访问其他人的处理程序。
您需要记住代表是不可变的。+=在事件上使用不会改变委托以向该委托添加新方法,它会创建一个新委托,该委托在调用时会调用一起添加的两个委托。使用-=创建一个委托,该委托调用第一个操作数(第二个操作数除外)的所有调用。因此,一遍又一遍地调用-=会不断创建越来越多的委托,每个委托调用的东西越来越少,直到最终到达委托不再调用任何东西的地步。仅分配null相当于仅创建一个不执行任何操作的委托,然后直接对其进行分配。
因此,当您-=一遍又一遍地调用在开始之前分配给事件的原始委托仍然存在,以及 N 个中间委托。也就是说,没有一个代表可能被任何根元素引用,因此它们都有资格被收集。如果您只是指定null您仍然拥有最初存在的相同孤立委托,那么您只是不再拥有任何中间委托。