您瞭解Activator.CreateInstance(Type type)方法嗎?使用該方法發現的問題…

來源:互聯網
上載者:User
文章有誤,等待晚上的新版本。。。

對於

public static Object CreateInstance (
    Type type
)

方法我想您應該用過,當您需要動態建立某些類型執行個體的時候您就需要它了。但是我今天測試該方法和用Expression Tree方法執行個體化對象的哪個執行的效率更快的時候,我發現一個問題。我把問題代碼抽出來,做幾個實驗,您看看:(該實驗在vs2008和vs2005下面都做了,實驗結果一樣,具體數值是vs2005下面的,以下代碼均是在Release模式下)

沒有直接執行個體化的

1 Stopwatch watch1 = new Stopwatch();
2 watch1.Start();
3 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
4 watch1.Stop();
5 Console.WriteLine("Activator CreateInstance");
6 Console.WriteLine(watch1.Elapsed.ToString());

 

 

得出的記過為:Activator CreateInstance
00:00:00.0001561

我在前面加上如下代碼:

Class1 c1 = new Class1();

 

再執行,我們看看結果:

Activator CreateInstance
00:00:00.0000203

 

您看到區別了嗎?沒有Class1 c1 = new Class1();的時候執行時間是有Class1 c1 = new Class1();執行時間的將近8倍。那麼我們再看下面的代碼:

 1 Class1 c1 = new Class1();
 2 
 3 Stopwatch watch1 = new Stopwatch();
 4 watch1.Start();
 5 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
 6 watch1.Stop();
 7 Console.WriteLine("Activator CreateInstance");
 8 Console.WriteLine(watch1.Elapsed.ToString());
 9 
10 Stopwatch watch2 = new Stopwatch();
11 watch2.Start();
12 Class1 formActivator2 = Activator.CreateInstance(typeof(Class1)) as Class1;
13 watch2.Stop();
14 Console.WriteLine("Activator CreateInstance");
15 Console.WriteLine(watch2.Elapsed.ToString());

 

我們再一次執行方法Activator.CreateInstance(),您能想到執行結果嗎?

Activator CreateInstance
00:00:00.0000206
Activator CreateInstance
00:00:00.0001156

 

吆喝,這個結果真是怪異啊!那麼再來看這個:

把執行個體化放在中間

 1 Stopwatch watch1 = new Stopwatch();
 2 watch1.Start();
 3 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
 4 watch1.Stop();
 5 Console.WriteLine("Activator CreateInstance");
 6 Console.WriteLine(watch1.Elapsed.ToString());
 7 
 8 Class1 c1 = new Class1();
 9 
10 Stopwatch watch2 = new Stopwatch();
11 watch2.Start();
12 Class1 formActivator2 = Activator.CreateInstance(typeof(Class1)) as Class1;
13 watch2.Stop();
14 Console.WriteLine("Activator CreateInstance");
15 Console.WriteLine(watch2.Elapsed.ToString());

 

您注意第八行,我們把執行個體化的代碼放在中間了,那麼結果又會怎麼樣呢?您請看:

Activator CreateInstance
00:00:00.0001715
Activator CreateInstance
00:00:00.0001111

 

和您預想的結果一樣嗎?
以下的疑問您能解答嗎?
1. Activator.CreateInstance到底是怎麼執行個體化對象的,和new有什麼區別呢?
2. 為什麼前面加上對象的直接執行個體化就會出現執行效率上的區別呢?
3. 為什麼把直接執行個體化放在中間就沒有相應的效果了呢?
4. 既然這樣,那麼我直接執行個體化兩次對象用方法Activator.CreateInstance(),會不會第二次的執行時間要比第一次少很多呢?(我的實驗結果,沒有影響)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.