[英]How is the interaction between LinkedList<T> and LinkedListNode<T> implemented in C#?
[英].Net - How are LinkedListNode<T>'s Properties assigned to?
根据.Net的LinkedListNode<T>
类的文档和元数据,其List
, Next
和Previous
属性是只读的。 但是, LinkedList<T>
以某种方式设法更改了这些属性。
LinkedList<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++;
}
LinkedListNode<T>
中的字段list
, prev
和next
用内部访问修饰符标记。 内部类型/成员只能由同一程序集中的其他类型访问。 在这种情况下, LinkedListNode<T>
和LinkedList<T>
都在系统程序集中。
如果我们看看它们的实际定义:
public sealed class LinkedListNode<T>
{
internal LinkedList<T> list;
internal LinkedListNode<T> next;
internal LinkedListNode<T> prev;
internal T item;
....
}
一个人总是可以在同一个类中更改数据,即使它的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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.