根据.Net LinkedListNode<T>
课程的文档和元数据,其List
,Next
和Previous
属性均为get-only。但是,LinkedList<T>
以某种方式设法改变这些属性。
LinkedList<T>
如何实现这一目标?
是使用反射还是使用内部制定者作弊?
答案 0 :(得分:2)
以下是the fields of LinkedListNode<T>
:
public sealed class LinkedListNode<T> {
internal LinkedList<T> list;
internal LinkedListNode<T> next;
internal LinkedListNode<T> prev;
internal T item;
// ...
}
正如您所看到的,这些字段是内部字段,因此它们可以由LinkedList<T>
(或System
程序集中的任何其他类来操纵),但您可以'从你的代码做到这一点。
private void InternalInsertNodeBefore(LinkedListNode<T> node, LinkedListNode<T> newNode) {
newNode.next = node;
newNode.prev = node.prev;
node.prev.next = newNode;
node.prev = newNode;
version++;
count++;
}
答案 1 :(得分:1)
list
中的字段prev
,next
和LinkedListNode<T>
标有内部访问修饰符。内部类型/成员只能访问同一程序集中的其他类型。在这种情况下,LinkedListNode<T>
和LinkedList<T>
都位于系统程序集中。
如果我们看一下它们的实际定义:
public sealed class LinkedListNode<T>
{
internal LinkedList<T> list;
internal LinkedListNode<T> next;
internal LinkedListNode<T> prev;
internal T item;
....
}
答案 2 :(得分:-1)
即使是get-only属性为
,也可以随时更改同一类中的数据参考下面的例子:
class Property
{
private string _name = "_name";
public string Name
{
get
{
return _name;
}
}
public void Foo()
{
_name = "foo";
}
static void Main(string[] args)
{
Property prop = new Property();
Console.WriteLine(prop.Name); // prints _name
prop.Foo();
Console.WriteLine(prop.Name); // prints foo
}
}