我很想知道为什么LinkedListNode类暴露的所有属性(Next, Previous, Value等)都是只读的,即这些属性没有相应的设置?
我试图解决一个与链表相关的小算法问题,并决定使用。net中内置的LinkedList类。但是由于LinkedListNode的类属性的只读行为,我不能重写值或改变任何给定节点的"Next"指针。
谢谢
Value
确实有一个setter,声明为public T Value { get; set; }
。
Next
和Previous
的设置器的缺乏阻止了你将链表转换成树或其他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;
}
}
所以你应该可以改变这个值