以下の 2 つの例の違いは何ですか? の目的は何Activator
ですか? なぜ使用するのですか?
1.
string objTypeName = "Foo";
Foo foo = (Foo)Activator.CreateInstance(Type.GetType(objTypeName));
2.
Foo foo = new Foo()
以下にリンクされているページの下を調べましたが、明確な画像が得られませんでした。
を使用Activator.CreateInstance
すると、所属するクラス(Reflectionなど)に直接アクセスできない場合でもオブジェクトを作成できるため、たとえば、別のオブジェクトと同じタイプのオブジェクトを作成できます。
var duplicate = Activator.CreateInstance(original.GetType());
元のオブジェクトのクラスを正確に知らない場合、これは不可能です。
設計時にインスタンス化するタイプがわかっている場合は、 を使用する必要はありませんActivator.CreateInstance
。すべてActivator.CreateInstance
は、パブリックのデフォルト コンストラクターを呼び出すことです。
Activator.CreateInstance
Type
は、設計時に不明な をインスタンス化する場合に役立つ「レイト バインディング」の 1 つの形式です。設計時に具象クラスの型がすでにわかっている場合は、「アーリー バインディング」を使用してインスタンス化することをお勧めします。これは、はるかに高速でシンプルで明白です。つまり、適切なコンストラクターを直接呼び出します。
Activator.CreatInstanceは、クラスFooのデフォルトコンストラクターを呼び出します。
唯一の違いは、タイプよりもタイプがわかっている場合は、それを作成するnew
方がはるかに理にかなっている(そして読みやすさ)ということです。