簡體   English   中英

LinkedList之間如何交互 <T> 和LinkedListNode <T> 用C#實現?

[英]How is the interaction between LinkedList<T> and LinkedListNode<T> implemented in C#?

首先,讓我們定義一個節點:

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

您會注意到,屬性node.Listnode.Nextnode.Previous都只能get 現在,將節點添加到LinkedList

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

此時,屬性node.List將進行更改以包含對linkedlist的引用。 同樣,如果將其他節點添加到LinkedList ,則NextPrevious屬性將被更新以反映鏈接列表的結構,即使這些屬性未公開公共set訪問器也是如此。

如何實施此行為?

我知道如何使用internal ,但是有更好的方法嗎? 例如,假設我有一個包含多種類型的程序集,而不僅僅是LinkedListLinkedListNode 通過為節點屬性ListPreviousNext setter,我將這些setter暴露給整個程序集,這是不希望的。

如何實施此行為?

如果不查看源代碼,我可能會猜想這些屬性的設置程序或后備字段標記為internal ,因此可以從LinkedList<T>訪問,因為它們都位於同一程序集中。

但是有更好的方法嗎?

並不是的。 讓我詳細說明。 還有其他選擇。

  1. 你可以使LinkedListNode<T>中定義的內部類LinkedList<T> 這是一個選擇,但對呼叫者來說是沉重的負擔。

  2. 您可以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM