0

Asp.Net で作業していたときXmlDOM、「XmlReader リーダー = XmlReader.Create()」のようなパターンがありました。

その後、同じパターンに数回遭遇しました。

静的コンストラクターと「new ClassName()」コンストラクターの違いを知りたいです (意味を説明するために正しい用語を使用しているかどうかはわかりません)。

私がXmlReader.Create()学びたいのは、なぜ静的コンストラクターを使用するのかということです。それはどのような側面を提供しますか?静的コンストラクターでできることは何ですか? new キーワード コンストラクターではできません。

前もって感謝します。

4

3 に答える 3

8

まず、用語を整理しましょう。静的コンストラクターXmlReader.Createではありません。これは、(通常) オブジェクトの新しいインスタンスを返す単なる静的メソッドです。これは通常「ファクトリーメソッド」と呼ばれます。static「静的コンストラクター」は、クラスの静的メンバーを初期化するために使用される、キーワードで宣言されたコンストラクターです。

class MyClass {
   static MyClass() { ... } // static constructor
}

ここで、ファクトリメソッドが望ましい理由について説明します。いくつかの理由が考えられます。

1 つには、( 経由で呼び出されるnew)コンストラクターは常に、新しくインスタンス化されたオブジェクトを提供するか、例外をスローする必要があります。ファクトリ メソッドはnull、それが理にかなっている場合に返すことができます。または、オブジェクトのキャッシュを保持し、常に新しいキャッシュを作成しないようにすることもできます (たとえば、オブジェクトが不変の場合)。

もう 1 つの理由は、 を実行するとnew T()常に具体的に のインスタンスが取得されることですTTファクトリ メソッドは、代わりに、入力パラメータやその他の要因に応じて、のサブクラスのインスタンスを作成できます。の場合、XmlReaderまさにこれが起こります。XmlReaderそれ自体がabstractであるため、そのインスタンスは存在しません。ただし、さまざまな目的 (検証/非検証、ストリーム バックエンド/DOM 支持など) を提供するいくつかのサブクラスがあり、XmlReader.Createオーバーロードとそれに提供する引数に基づいて適切なものを選択します。

于 2009-10-29T19:50:22.023 に答える
0

静的コンストラクターは、静的データを初期化するため、または一度だけ実行する必要がある特定のアクションを実行するために使用されます。最初のインスタンスが作成される前、または静的メンバーが参照される前に自動的に呼び出されます。インスタンス変数を初期化するためにクラシック コンストラクターが使用され、オブジェクトが作成されるたびに呼び出されます。

于 2009-10-29T19:47:05.553 に答える
0

両方のコンストラクターで同じことができます。違いはありません。ただし、静的コンストラクターは、プログラムの存続期間中に一度し​​か呼び出されず静的メンバーを持つクラスに対してのみ許可されます。プライベート静的変数を使用する前に初期化できます。

于 2009-10-29T19:47:13.130 に答える