Activator.CreateInstance和Activator.CreateInstance <type> </type>之间的区别

时间:2015-02-10 12:05:14

标签: c# createinstance

编写以下代码时,它们之间的区别是什么:

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秒内完成。那么考虑到内部使用的步骤,他们有什么不同呢?

1 个答案:

答案 0 :(得分: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);

generic version已实施(也缩短为):

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

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

所以唯一的区别是第二个布尔参数,它具有参数名skipCheckThis,它有一些minor internal tests or not。因此,通用版本稍微快一点,因为它只是简单地跳过了这些测试,但你无法真正测量这些差异。