Activator.CreateInstance 和 Activator.CreateInstance<Type> 之间的区别
difference between Activator.CreateInstance and Activator.CreateInstance<Type>
编写以下代码时,它们有什么区别:
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 秒内工作。那么考虑到内部使用的步骤,它们有什么区别?
最简单的看一下源代码。
实现的Activator.CreateInstance(type)
calls 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。因此,通用版本稍微快一些,因为它只是跳过了这些测试,但您将无法真正衡量这些差异。
编写以下代码时,它们有什么区别:
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 秒内工作。那么考虑到内部使用的步骤,它们有什么区别?
最简单的看一下源代码。
实现的Activator.CreateInstance(type)
calls 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。因此,通用版本稍微快一些,因为它只是跳过了这些测试,但您将无法真正衡量这些差异。