0

まず、ノードを定義しましょう。

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が、もっと良い方法はありますか? たとえば、 and だけでなく、多くの型を含む 1 つのアセンブリがあるLinkedListとしLinkedListNodeます。ノード プロパティListPreviousおよびのセッターを作成することでNext、これらのセッターをアセンブリ全体に公開していますが、これは望ましくありません。

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>内部バッキングフィールドがあります。

これを行う 1 つの方法は、ネストされたクラスを使用することです。これが「より良い」方法と見なされるかどうかはわかりませんが、内部セッター/フィールドを回避します。実装の一部を省略しているため、構造の概要を確認できます。

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>

于 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 に答える