![](/img/trans.png)
[英]How exactly is LinkedList<T> and LinkedListNode<T> implemented in C#? And how exactly does LinkedList<T>.Remove(LinkedListNode<T>) work?
[英]How is the interaction between LinkedList<T> and LinkedListNode<T> implemented in C#?
首先,让我们定义一个节点:
LinkedListNode<int> node = new LinkedListNode<int>(43);
您会注意到,属性node.List
, node.Next
和node.Previous
都只能get
。 现在,将节点添加到LinkedList
:
LinkedList<int> linkedlist = new LinkedList<int>();
linkedlist.AddFirst(node);
此时,属性node.List
将进行更改以包含对linkedlist
的引用。 同样,如果将其他节点添加到LinkedList
,则Next
和Previous
属性将被更新以反映链接列表的结构,即使这些属性未公开公共set
访问器也是如此。
如何实施此行为?
我知道如何使用internal
,但是有更好的方法吗? 例如,假设我有一个包含多种类型的程序集,而不仅仅是LinkedList
和LinkedListNode
。 通过为节点属性List
, Previous
和Next
setter,我将这些setter暴露给整个程序集,这是不希望的。
如何实施此行为?
如果不查看源代码,我可能会猜想这些属性的设置程序或后备字段标记为internal
,因此可以从LinkedList<T>
访问,因为它们都位于同一程序集中。
但是有更好的方法吗?
并不是的。 让我详细说明。 还有其他选择。
你可以使LinkedListNode<T>
中定义的内部类LinkedList<T>
这是一个选择,但对呼叫者来说是沉重的负担。
您可以将LinkedList<T>
和LinkedListNode<T>
雕刻到它们自己的程序集中。 这显然给用户带来负担,并且可能很快退化为维护崩溃。
我认为这两种方法都不是更好的解决方案。
我检查了ILSpy,只读属性由internal
字段支持。
internal LinkedListNode<T> next;
public LinkedListNode<T> Next {
get {
if (this.next != null && this.next != this.list.head) {
return this.next;
}
return null;
}
}
至于如何做不同的事情,以及是否愿意的讨论,请参阅此问题及其答案。
杰森是正确的。 我查看了源代码, LinkedListNode<T>
具有内部支持字段。
一种方法是使用嵌套类。 我不知道这是否符合“更好”的方式,但是它确实避免了内部设置器/字段。 我省略了一些实现,因此您可以看到结构的轮廓:
public class Node<T>
{
private List list;
private Node<T> prev, next;
public List List { get { return list; } }
// other accessors.
public abstract class List
{
Node<T> head;
internal List() { }
public AddFirst(Node<T> node)
{
// node adding logic.
node.list = this;
}
// implementation elided for brevity
}
}
public class MyLinkedList<T> : Node<T>.List { }
现在,您可以声明MyLinkedList
并向其中添加节点,但是Node<T>
上没有内部访问器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.