【问题标题】:difference between Activator.CreateInstance and Activator.CreateInstance<Type>Activator.CreateInstance 和 Activator.CreateInstance<Type> 之间的区别
【发布时间】:2015-02-10 12:05:14
【问题描述】:

在编写以下代码时,它们有什么区别:

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 秒内工作。那么考虑到内部使用的步骤,它们有什么区别?

【问题讨论】:

  • 和我看到的一样,但第二个更优雅
  • 通用版本只是为您执行演员表。这是为了方便。
  • 那很糟糕,我希望我能用后者获得一些时间......不过谢谢
  • 如果您想加快速度,请使用为您实例化类型的表达式树生成 Func

标签: c# createinstance


【解决方案1】:

最简单的看一下源代码。

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。因此,通用版本稍微快一些,因为它只是跳过了这些测试,但您将无法真正衡量这些差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多