![](/img/trans.png)
[英]Activator.CreateInstance(string) and Activator.CreateInstance<T>() difference
[英]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)
調用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
,該參數是否進行一些較小的內部測試 。 因此,通用版本會稍快一些,因為它只是跳過了這些測試,但是您將無法真正衡量這些差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.