0

首先,让我们定义一个节点:

LinkedListNode<int> node = new LinkedListNode<int>(43);

您会注意到属性node.List,node.Nextnode.Previous都是get唯一的。现在让我们将节点添加到 a LinkedList

LinkedList<int> linkedlist = new LinkedList<int>();
linkedlist.AddFirst(node);

此时,属性node.List将发生更改以包含对 的引用linkedlist。类似地,如果将其他节点添加到 中LinkedList,则NextPrevious属性将被更新以反映链表的结构,即使这些属性没有公开公共set访问器。

这种行为是如何实现的?

我知道如何使用internal,但有更好的方法吗?例如,假设我有一个包含许多类型的程序集,而不仅仅是LinkedListand LinkedListNode。通过为节点属性和制作设置器List,我将这些设置器暴露给整个程序集,这是不希望的。PreviousNext

4

3 回答 3

3

这种行为是如何实现的?

在不查看源代码的情况下,我猜想这些属性的设置器或支持字段已被标记internal,因此可以从中访问,LinkedList<T>因为它们都位于同一个程序集中。

但是有更好的方法吗?

并不真地。让我详细说明。还有其他选择。

  1. 您可以创建LinkedListNode<T>一个在LinkedList<T>. 这是一种选择,但对呼叫者来说是个负担。

  2. 您可以雕刻LinkedList<T>LinkedListNode<T>放入自己的组件中。这显然是用户的负担,并且可能很快退化为维护崩溃。

我将这两个都描述为不是更好的解决方案。

于 2013-06-12T21:13:04.920 回答
1

杰森是正确的。我查看了源代码并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 { }

现在您可以声明 aMyLinkedList并向其添加节点,但 . 上没有内部访问器Node<T>

于 2013-06-12T21:29:03.467 回答
1

我检查了 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;
    }
}

至于如何以不同的方式进行操作,以及您是否愿意的讨论,请参阅这个问题及其答案。

于 2013-06-12T21:13:56.553 回答