我如何处置一个对象



我试图从链表中删除一个节点。下面是我试过的代码。

public class Node : IDisposable
{
    public int Value { get; set; }
    public Node Next { get; set; }
    public Node(int value)
    {
        this.Value = value;
    }
    public void Dispose()
    {
        Dispose(true);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            Next.Dispose();
        }
    }
}
public class LinkedList
{
    Node head;
    public void CreateList()
    {
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        head = node1;
        node1.Next = node2;
        node2.Next = node3;
    }
    public void DeleteLastItem()
    {
            Node prevNode = head;
            Node nextNode = head;
            while (nextNode.Next != null)
            {
                prevNode = nextNode;
                nextNode = nextNode.Next;
            }
            prevNode.Next = null;
            nextNode.Dispose();
    }
}

我想处理nextNode(这只是最后一个节点)。并且它不会成为链表的一部分)。

当我尝试上面的代码,我得到下面的异常:

Unhandled Exception: System。NullReferenceException:对象引用没有设置为对象的实例。

我该怎么做呢?如何处理Node对象?

在您的Dispose(bool)方法中,您只能处置下一个节点,如果有一个。在尝试

之前检查是否有空引用:
protected virtual void Dispose(bool disposing) {
  if (disposing) {
    if (Next != null) {
      Next.Dispose();
    }
  }
}

我想你应该在调用Dispose之前简单地检查Next是否不为空。

当在任何节点上调用Dispose方法时,您手动调用下一个,因此您将到达最后一个,next属性将为空,因此您得到此异常。

考虑到您给出的代码,我不明白为什么您需要您的节点是一次性的。只有当您使用非托管资源时才有必要,这在您给出的代码中不是这种情况(但也许您为问题简化了它)。

在Dispose逻辑中,检查NULL:

public class Node : IDisposable
{
    public int Value { get; set; }
    public Node Next { get; set; }
    public Node(int value)
    {
        this.Value = value;
    }
    public void Dispose()
    {
        Dispose(true);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (Next != null) // <-- new code here
            {
                Next.Dispose();
            }                 
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新