我只是想知道在创建对象的新实例之前是否需要取消注册事件...为了清楚起见:
假设我有一个超级链接,并且已经为它创建了一个实例。
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是否有任何好处新实例。