【问题标题】:C# custom linked list node deletion - Garbage collectionC#自定义链表节点删除——垃圾回收
【发布时间】:2023-03-26 17:07:01
【问题描述】:

以下是创建自定义 C# 列表并删除列表中的节点的代码:

static void Main(string[] args)
{
    ListNode rootNode = CreateList();
    DeleteNode(rootNode.ChildNode);
    ....
}

private static ListNode CreateList()
{
    ListNode node1 = new ListNode()
    {
        Value = 1,
        ParentNode = null;
    }

    ListNode node2 = new ListNode()
    {
        Value = 2,
        ParentNode = node1
    }

    node1.ChildNode = node2;

    return node1;
}

private static void DeleteNode(ListNode node2)
{
    node2.ParentNode.ChildNode = null;
    node2 = null;
}

我可以假设在调用 DeleteNode(rootNode.ChildNode) 之后,子节点(或 node2)将被垃圾收集吗?

【问题讨论】:

  • 不,你不能假设它会被垃圾回收,但你可以假设如果发生 GC,它会被回收,因为它不再是 root。
  • 如果要显式释放资源,可以使用IDisposable接口docs.microsoft.com/en-us/dotnet/api/…

标签: c# linked-list garbage-collection


【解决方案1】:

不一定(此时可能会启动也可能不会启动),GC 过程通常会导致性能下降,并且优化算法以减少它,因此它不会在每次清理未引用对象的机会时启动。您可以通过显式调用 GC.Collect(); 来强制 GC,但不鼓励/不建议这样做,因为您可能没有考虑到算法所考虑的所有因素 - 所以不要这样做。
您可以阅读 thisshort 文章以了解该算法的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2012-03-24
    • 1970-01-01
    • 2012-10-31
    • 2015-05-15
    • 2011-11-29
    • 2021-12-20
    相关资源
    最近更新 更多