1

次のコードを書くとき、それらの違いは何ですか:

MyClass parcel;
for (int i = 0; i < 100000000; i++) parcel = (MyClass)Activator.CreateInstance(typeof(MyClass));
for (int i = 0; i < 100000000; i++) parcel = Activator.CreateInstance<MyClass>();

実際の型はコンパイル時にすでにわかっているため、後者の方がはるかに高速であると予想していましたが、違いはありません。私のマシンでは、両方とも約9秒で動作します。では、内部で使用される手順を考慮した場合の違いは何ですか?

4

1 に答える 1

0

最も簡単な方法として、ソース コードを見てみましょう。

このように実装されているActivator.CreateInstance(type)呼び出し(短縮版):Activator.CreateInstance(type, false);

RuntimeType rt = type.UnderlyingSystemType as RuntimeType;
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;

return rt.CreateInstanceDefaultCtor(!nonPublic, false, true, ref stackMark);

汎用バージョンは次のように実装されています (これも短縮されています)。

RuntimeType rt = typeof(T) as RuntimeType;
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;

return (T)rt.CreateInstanceDefaultCtor(true, true, true, ref stackMark);

したがって、唯一の違いは、引数 name を持つ 2 番目のブール値パラメーターであり、skipCheckThisいくつかのマイナーな内部テストを実行するかどうかです。このため、一般的なバージョンはこれらのテストをスキップするだけでわずかに高速ですが、これらの違いを実際に測定することはできません.

于 2015-02-10T12:26:34.877 に答える