首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Activator.CreateInstance与Activator.CreateInstance<Type>的区别

Activator.CreateInstance与Activator.CreateInstance<Type>的区别
EN

Stack Overflow用户
提问于 2015-02-10 12:05:14
回答 1查看 113关注 0票数 1

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

代码语言:javascript
复制
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秒左右工作。那么,考虑到内部使用的步骤,它们有什么不同呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-10 12:26:34

最简单地看一下源代码。

Activator.CreateInstance(type)调用Activator.CreateInstance(type, false);,其实现方式如下(简写):

代码语言:javascript
复制
RuntimeType rt = type.UnderlyingSystemType as RuntimeType;
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;

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

通用版本的实现(也是缩短)如下:

代码语言:javascript
复制
RuntimeType rt = typeof(T) as RuntimeType;
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;

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

所以唯一的区别是第二个布尔参数,它有参数名skipCheckThis,它执行一些轻微的内部测试。由于这个原因,通用版本稍微快了一点,因为它只是跳过了这些测试,但是您将无法真正测量这些差异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28431220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档