当编写以下代码时,它们的区别是什么:
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秒左右工作。那么,考虑到内部使用的步骤,它们有什么不同呢?
发布于 2015-02-10 12:26:34
最简单地看一下源代码。
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);所以唯一的区别是第二个布尔参数,它有参数名skipCheckThis,它执行一些轻微的内部测试。由于这个原因,通用版本稍微快了一点,因为它只是跳过了这些测试,但是您将无法真正测量这些差异。
https://stackoverflow.com/questions/28431220
复制相似问题