2010-03-25 33 views
0

我知道C#4.0中的新「動態」關鍵字有助於與動態.NET語言的交互,並且可以通過使用它而不是反射來幫助剪切代碼。所以用法適用於非常特殊的情況。'動態'關鍵字和DLR是否將C#作爲動態類型語言提升爲第一類公民?

但是,我想知道的是,它是否會給C#帶來的其他動態語言(如IronXXX語言)所帶來的所有動態優勢?換句話說,是否可以用動態語言風格在C#中編寫整個應用程序?

如果有可能,是否會被推薦。爲什麼,或者爲什麼不分別?

我是否可以在不切換到其他語言的情況下獲得動態語言的所有好處?

回答

5

我不會說C#是一流的動態語言,沒有。

首先,一些靜態打字功能在動態打字中的效果並不好。例如:

public void ShowListCount(IList foo) 
{ 
    dynamic d = foo; 
    Console.WriteLine(d.Count); 
} 

這看起來像它應該總是工作,因爲IList暴露Count,對不對?試試這個:

ShowListCount(new int[10]); 

Bang。數組實現IList.Count具有明確的接口實現,所以當動態類型將對象看作數組時,它看起來不會看到Count屬性。有這樣的各種陷阱。另外,如果要在C#中實現動態行爲(即動態調用),則不存在明確的語言支持。你可以從DynamicObject派生或實現IDynamicMetaObjectProvider你自己,但沒有任何語言會幫助你。

我認爲C#中的動態類型主要用於當您想與現有動態平臺(如IronPython)或弱類型COM API進行互操作時使用的東西。有一些一些它可以在純C#中有用,但它們相對較少。

基本上C#仍然是一個非常明顯的設計靜態類型的語言。有能力在你想要的地方仔細地使用動態輸入是很好的,但是如果你想爲你的代碼庫的一個區域廣泛地使用動態輸入,我會建議在IronPython中寫入那一點,然後從C#中調用它。

+0

謝謝。非常明確和翔實的答案。 有關顯式接口實現的有趣陷阱。 – 2010-03-25 10:47:31

1

儘管dynamic關鍵字肯定會使C#更接近動態世界,但它不會使其成爲動態語言,因此它不會具有動態語言的優點,例如在運行時向現有類型添加方法, ...