文章有誤,等待晚上的新版本。。。
對於
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());
7
得出的記過為: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(),會不會第二次的執行時間要比第一次少很多呢?(我的實驗結果,沒有影響)