我想我要做的很简单,但我做不到
我在A类中的某个地方有一个静态事件:
public static event Action OnInvalidated;当我的数据失效时,我调用它。当我实例化一个B类型的新类时,我想做以下事情:
A.OnInvalidated+= () => this.RefreshColumns();基本上,我希望在触发OnInvalidated时对注册的每个实例调用RefreshColumns。
这编译得很好,但是当我处理对象时,如何删除lambda函数呢?我认为这样做
A.OnInvalidated-= () => this.RefreshColumns();不会起作用,而且我不能声明
Action myAction = () => this.RefreshColumns();作为函数成员
发布于 2012-09-05 01:08:34
首先,而不是做:
A.OnInvalidated+= () => this.RefreshColumns();只需直接指定方法(请注意,()和lambda声明都丢失了):
A.OnInvalidated += this.RefreshColumns;然后,当您取消订阅时,您只需执行以下操作:
A.OnInvalidated -= this.RefreshColumns;我认为问题是你在不需要的时候引入了这个匿名的lambda,使得取消订阅该方法变得更加困难。
发布于 2012-09-05 01:05:10
试一下,如下所示:
class A : IDisposable
{
public static event Action OnInvalidated;
public A()
{
A.OnInvalidated += this.SomeMethod();
A.OnInvalidated += this.SomeOtherMethod();
}
public void Dispose()
{
A.OnInvalidated -= this.SomeMethod();
A.OnInvalidated -= this.SomeOtherMethod();
}
public SomeMethod()
{
}
public SomeOtherMethod()
{
}
}请注意,如果想要避免内存泄漏,在Dispose()中实现IDisposable和取消订阅所有静态事件是很重要的。否则,静态事件的订阅者将永远不会被垃圾回收,因为事件维护着对对象的引用。
https://stackoverflow.com/questions/12267886
复制相似问题