我面临的情况是我有依赖对象,我希望能够删除一个对象及其所有引用.
假设我有一个类似下面代码的对象结构,其中Branch类型引用了两个节点.
public class Node
{
// Has Some Data!
}
public class Branch
{
// Contains references to Nodes
public Node NodeA
public Node NodeB
}
public class Graph
{
public List<Node> Nodes;
public List<Branch> Branches;
}
Run Code Online (Sandbox Code Playgroud)
如果我从Graph类的Nodes列表中删除一个Node,那么一个或多个Branch对象仍然可能包含对已删除节点的引用,从而将其保留在内存中,而我真的很想设置它对已删除的节点的任何引用都为null并让垃圾收集启动.
除了枚举每个分支并按顺序检查每个节点引用之外,是否有关于如何删除每个分支实例中节点的引用以及引用已删除节点的任何其他类的任何明智想法?
没有内置的C#语言功能来实现这一功能(你无法真正跟踪任务).您必须在某处跟踪所有引用,并在为其分配新引用时立即更新它.一般的想法是Removed
在Node
自身中提供事件并在该对象被放弃时引发事件.每次要保留对该引用的新引用时Node
,您都会使用匹配的委托订阅该事件,该委托将对该对象的引用置零.当然,如果您使用一组以特定方式引用节点的先前已知类型来执行此操作,则可能有更简单,更有效的方法来完成任务.
更改您的节点以包含其所在分支的列表:
public class Node
{
// Has Some Data!
public List<Branch> BranchesIn;
public List<Branch> BranchesOut; // assuming this is a directed graph
public void Delete()
{
foreach (var branch in BranchesIn)
branch.NodeB.BranchesOut.Remove(branch);
foreach (var branch in BranchesOut)
branch.NodeA.BranchesIn.Remove(branch);
BranchesIn.Clear();
BranchesOut.Clear();
}
}
public class Branch
{
// Contains references to Nodes
public Node NodeA
public Node NodeB
}
Run Code Online (Sandbox Code Playgroud)
现在您的 Graph 类不需要节点或分支列表,它只需要一个根节点。当你删除一个节点时,你会删除它的所有分支。显然,您封装了添加和删除节点和分支的所有方法,因此外部代码无法破坏结构。
如果您实际上没有在分支(更通常称为边缘)上存储任何数据,则根本不需要它。节点可以只维护它们链接进出的其他节点的列表。
归档时间: |
|
查看次数: |
3055 次 |
最近记录: |