为什么LinkedListNode类是不可变的?

时间:2014-08-23 18:01:18

标签: c# .net linked-list

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

我试图解决与链接列表相关的小算法问题,并决定使用.Net内置的LinkedList类。但是由于LinkedListNode的类属性的只读行为,我无法覆盖这些值或更改" Next"任何给定节点的指针。

由于

2 个答案:

答案 0 :(得分:6)

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

NextPrevious上缺少设置者会阻止您将链接列表转换为LinkedList方法无法应对的树或其他拓扑。

  

The LinkedList class does not support chaining, splitting, cycles, or other features that can leave the list in an inconsistent state.

您可以使用列表的方法(例如AddBefore)更改这些属性,这些方法可以保留每个LinkedListNode只是一个列表成员的不变量,node.Next.Previous始终指向node 1}},没有周期等等。

答案 1 :(得分:2)

Next / Previous只是为了确保您不会搞砸列表结构。您必须使用LinkedList<T>方法来修改列表,并确保您不会以错误的状态结束。让你改变参考文献就可以了。

即使MSDN statesValue无法设置,如果您查看LinkedListNode<T> source code,您会发现实际上已经定义了一个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;
    }           
}  

所以你应该能够改变价值。