处理它引用的对象后,事件会发生什么?

发布于 2024-11-30 06:19:09 字数 399 浏览 0 评论 0原文

如果我将某个对象的方法链接到委托,然后处理该对象,会发生什么?

像这样:

class Hunter
{
    public event Action Shoot;

    public execute()
    {
        Form formBabySeal = new Form();

        Shoot += formBabySeal.Close;

        formBabySeal.Show();
        formBabySeal.Close(); //Dispose Form

        if (Shoot != null)
        {
             Shoot(); //event is null?
        }
    }
}

what happens if i link a method of some object to a delegate, and then dispose of the object?

Like this:

class Hunter
{
    public event Action Shoot;

    public execute()
    {
        Form formBabySeal = new Form();

        Shoot += formBabySeal.Close;

        formBabySeal.Show();
        formBabySeal.Close(); //Dispose Form

        if (Shoot != null)
        {
             Shoot(); //event is null?
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

埖埖迣鎅 2024-12-07 06:19:10

formBabySeal 不只是因为您处置它而 null 。因此,formBabySeal.Close() 将被调用。

当查看调用的方法时,您的代码与此等效:

Form formBabySeal = new Form();

formBabySeal.Show();
formBabySeal.Close(); //Dispose Form
formBabySeal.Close();

这将关闭表单(第一次调用 Close),第二次调用不会执行任何操作,因为表单已经关闭。

然而,正如 Steve 在评论部分指出的那样,您的代码将引入内存泄漏,因为 Shoot 仍然保留对 formBabySealClose 方法的引用因此,只要 Hunter 类的实例处于活动状态,formBabySeal 就会保持活动状态。

formBabySeal is not null just because you dispose it. So, formBabySeal.Close() will be called.

Your code is equivalent to this when looking at what methods are called:

Form formBabySeal = new Form();

formBabySeal.Show();
formBabySeal.Close(); //Dispose Form
formBabySeal.Close();

This will close the form (first call to Close) and the second call won't do anything, because the form is already closed.

However, as Steve points out in the comment section, your code will introduce a memory leak, because Shoot still holds a reference to the Close method of formBabySeal and because of this formBabySeal will be kept alive as long as the instance of the class Hunter is alive.

遇见了你 2024-12-07 06:19:10

带有 SOS 扩展的 WinDBG 有一种方法可以显示任何对象的 GCRoot。这可能会给你更多线索。

WinDBG with SOS extensions has a way to show GCRoot of any object. This might give you more clues.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文