首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按事件通知实例

按事件通知实例
EN

Stack Overflow用户
提问于 2012-09-05 00:42:03
回答 2查看 70关注 0票数 2

我想我要做的很简单,但我做不到

我在A类中的某个地方有一个静态事件:

代码语言:javascript
复制
public static event Action OnInvalidated;

当我的数据失效时,我调用它。当我实例化一个B类型的新类时,我想做以下事情:

代码语言:javascript
复制
A.OnInvalidated+= () => this.RefreshColumns();

基本上,我希望在触发OnInvalidated时对注册的每个实例调用RefreshColumns。

这编译得很好,但是当我处理对象时,如何删除lambda函数呢?我认为这样做

代码语言:javascript
复制
 A.OnInvalidated-= () => this.RefreshColumns();

不会起作用,而且我不能声明

代码语言:javascript
复制
Action myAction = () => this.RefreshColumns();

作为函数成员

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-05 01:08:34

首先,而不是做:

代码语言:javascript
复制
A.OnInvalidated+= () => this.RefreshColumns();

只需直接指定方法(请注意,()和lambda声明都丢失了):

代码语言:javascript
复制
A.OnInvalidated += this.RefreshColumns;

然后,当您取消订阅时,您只需执行以下操作:

代码语言:javascript
复制
A.OnInvalidated -= this.RefreshColumns;

我认为问题是你在不需要的时候引入了这个匿名的lambda,使得取消订阅该方法变得更加困难。

票数 1
EN

Stack Overflow用户

发布于 2012-09-05 01:05:10

试一下,如下所示:

代码语言:javascript
复制
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和取消订阅所有静态事件是很重要的。否则,静态事件的订阅者将永远不会被垃圾回收,因为事件维护着对对象的引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12267886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档