在创建对象的新实例之前,是否需要/是否有益于取消注册事件?

时间:2014-05-19 17:15:42

标签: c# events memory-leaks garbage-collection

我只是想知道在创建对象的新实例之前是否需要取消注册事件...为了清楚起见:

假设我有一个超级链接,并且已经为它创建了一个实例。

Hyperlink m_myHyperlink = new Hyperlink();

在控件设置超链接的代码中,根据特定条件向其注册了事件。

...

private void SetValue(...)
{
    ...

    m_myHyperlink = new Hyperlink(new Run(displayText));

    Uri path = null;

    if (Uri.TryCreate(link, UriKind.Absolute, out path)
    {
         m_myHyperlink.NavigateUri = path;
         m_myHyperlink.RequestNavigate += new RequestNavigateEventHandler(foo);
    }
    else
    {
         m_myHyperlink.Click += new RoutedEventHandler(bar);
    }
}

...

因此,下次设置该值时,会为m_myHyperlink创建一个新实例,并根据条件注册事件。

是否,我需要担心在创建新实例之前取消注册事件?所以,代码看起来像这样。

...

private void SetValue(...)
{
    ...

    // I know one of these would not be registered, but it is legal to attempt to
    // unregister it anyways...
    m_myHyperlink.RequestNavigate -= new RequestNavigateEventHandler(foo);
    m_myHyperlink.Click -= new RoutedEventHandler(bar);

    m_myHyperlink = new Hyperlink(new Run(displayText));

    Uri path = null;

    if (Uri.TryCreate(link, UriKind.Absolute, out path)
    {
         m_myHyperlink.NavigateUri = path;
         m_myHyperlink.RequestNavigate += new RequestNavigateEventHandler(foo);
    }
    else
    {
         m_myHyperlink.Click += new RoutedEventHandler(bar);
    }
}

...

我猜测GC可以在不注销事件的情况下处理旧实例,但是想要确保在创建之前通过取消注册事件来帮助旧实例的GC是否有任何好处新实例。

0 个答案:

没有答案