为什么LinkedListNode类是不可变的?

本文关键字:不可变 LinkedListNode 为什么 | 更新日期: 2023-09-27 18:19:09

我很想知道为什么LinkedListNode类暴露的所有属性(Next, Previous, Value等)都是只读的,即这些属性没有相应的设置?

我试图解决一个与链表相关的小算法问题,并决定使用。net中内置的LinkedList类。但是由于LinkedListNode的类属性的只读行为,我不能重写值或改变任何给定节点的"Next"指针。

谢谢

为什么LinkedListNode类是不可变的?

Value确实有一个setter,声明为public T Value { get; set; }

NextPrevious的设置器的缺乏阻止了你将链表转换成树或其他LinkedList方法无法处理的拓扑结构。

LinkedList类不支持链接、分裂、循环或其他可能使列表处于不一致状态的特性。

您可以通过使用列表的方法来更改这些属性,例如AddBefore,它保留了每个LinkedListNode仅是一个列表的成员,node.Next.Previous始终指向node,并且没有循环等不变性。

Next/Previous是只读的,以确保您不会弄乱列表结构。您必须使用LinkedList<T>方法来修改列表,它们将确保您不会以不正确的状态结束。让你改变引用将使它成为可能。

即使MSDN声明,Value是不可设置的,如果你看看LinkedListNode<T>的源代码,你会发现实际上有一个定义的setter !

// Note following class is not serializable since we customized the serialization of LinkedList. 
[System.Runtime.InteropServices.ComVisible(false)] 
public sealed class LinkedListNode<T> {
    internal LinkedList<T> list;
    internal LinkedListNode<T> next;
    internal LinkedListNode<T> prev;
    internal T item;
    public LinkedListNode( T value) {
        this.item = value;
    }
    internal LinkedListNode(LinkedList<T> list, T value) {
        this.list = list;
        this.item = value;
    }
    public LinkedList<T> List {
        get { return list;}
    }
    public LinkedListNode<T> Next {
        get { return next == null || next == list.head? null: next;}
    }
    public LinkedListNode<T> Previous {
        get { return prev == null || this == list.head? null: prev;}
    }
    public T Value {
        get { return item;}
        set { item = value;}
    }
    internal void Invalidate() {
        list = null;
        next = null;
        prev = null;
    }           
}  

所以你应该可以改变这个值