2015-02-23 53 views
2

有了這個代碼:Activator.CreateInstance和使用表達式之間有明顯的區別嗎?

public static class ChocolateFactory<T> 
{ 
    private static Func<int, int, T> Func { get; set; } 

    static ChocolateFactory() 
    { 
     ChocolateFactory<EmergencyChocolate>.Func = (a, b) => new EmergencyChocolate(a, b); 
    } 

    public static T CreateChocolate(int a, int b) 
    { 
     return (T)Activator.CreateInstance(typeof(T), a, b); 
     //return ChocolateFactory<T>.Func(a, b); 
    } 
} 

如果我運行:

var myChocolate = ChocolateFactory<EmergencyChocolate>.CreateChocolate(1, 2);

是否有創造的兩種方法(一個被註釋掉)之間的顯著差異? Activator的代碼更清晰,但我知道它可以更慢,但我想知道如果我忽略了其他任何東西。我也想知道這裏是否有預先編譯好的東西。

此外,如果不使用激活器,這裏的方法名稱是什麼?

回答

7

如果您使用Activator.CreateInstance,沒有靜態檢查。編譯器無法檢查是否存在具有兩個參數int的公共構造函數。

它可能比較慢,因爲它使用反射。

0

使用激活器類,您可以通過只有一個方法來生成任何類型的實例。

使用您的工廠方法,您只能創建一個類的實例,對於不同的類您必須創建不同的工廠方法。

活化劑並不比其他的更乾淨。這取決於你想要做什麼。一個IoC容器通常使用Activator,因爲它不能爲所有類創建工廠方法,因爲它根本不知道你有什麼。

+0

你能解釋爲什麼'返回ChocolateFactory .Func(a,b);'只適用於一種類型? – 2015-02-23 11:13:50

+0

在你的例子中,你有這個硬編碼:新的EmergencyChocolate(...),這就是爲什麼。使用激活器你沒有參考具體的類,你總是使用T和typeof(T) – dustinmoris 2015-02-23 11:16:40

+0

哦,我沒有注意到什麼是func返回。感謝您的解釋。順便說一句,我不是問題的主人...... :) – 2015-02-23 11:18:52

相關問題