我派生了自定义TreeNode
类型TreeNodeEx
。在我的TreeNodeEx
中,我订阅了NameChanged
事件,其中包含一些分配给它的Value对象。此Value的生命周期长于树节点的生存期。
我的想法是,当删除树节点时,Value仍然通过事件处理程序委托引用树节点。所以这将保留对树节点的悬空引用。
TreeNode
不是IDisposable
,并且在TreeNode
中没有要覆盖的事件或方法,以便知道何时删除它,因此,当我应该从事件中取消时。那么,我怎么知道何时解开?
class TreeNodeEx : TreeNode {
private Foo m_value;
public Foo Value {
get { return m_value; }
set {
if (m_value != null) {
m_value.NameChanged -= ValueNameChanged;
}
m_value = value;
if (m_value != null) {
m_value.NameChanged += ValueNameChanged;
}
}
}
private void ValueNameChanged(object sender, EventArgs e) {
// ...
}
}
答案 0 :(得分:3)
用户无法自行删除节点,因此您在代码中的任何地方都应该处理treeView1.Nodes.Remove(...)
处理您的处置职责。