まず、用語を整理しましょう。静的コンストラクターXmlReader.Createではありません。これは、(通常) オブジェクトの新しいインスタンスを返す単なる静的メソッドです。これは通常「ファクトリーメソッド」と呼ばれます。static「静的コンストラクター」は、クラスの静的メンバーを初期化するために使用される、キーワードで宣言されたコンストラクターです。
class MyClass {
static MyClass() { ... } // static constructor
}
ここで、ファクトリメソッドが望ましい理由について説明します。いくつかの理由が考えられます。
1 つには、( 経由で呼び出されるnew)コンストラクターは常に、新しくインスタンス化されたオブジェクトを提供するか、例外をスローする必要があります。ファクトリ メソッドはnull、それが理にかなっている場合に返すことができます。または、オブジェクトのキャッシュを保持し、常に新しいキャッシュを作成しないようにすることもできます (たとえば、オブジェクトが不変の場合)。
もう 1 つの理由は、 を実行するとnew T()、常に具体的に のインスタンスが取得されることですT。Tファクトリ メソッドは、代わりに、入力パラメータやその他の要因に応じて、のサブクラスのインスタンスを作成できます。の場合、XmlReaderまさにこれが起こります。XmlReaderそれ自体がabstractであるため、そのインスタンスは存在しません。ただし、さまざまな目的 (検証/非検証、ストリーム バックエンド/DOM 支持など) を提供するいくつかのサブクラスがあり、XmlReader.Createオーバーロードとそれに提供する引数に基づいて適切なものを選択します。