2011-06-14 64 views
4

可能重複:
How will you use the C# 4 dynamic type ?C#實際使用

什麼是動態關鍵字的實際動手用法?

dynamic a = 1; 
a.Crash(); 

我知道在XML鏈中它更具可讀性的情況,但除此之外,它有什麼好處?

+0

http://msdn.microsoft.com/en-us/library/dd264736.aspx – 2011-06-14 16:58:38

回答

4

這裏的好文章:

作爲開發人員,您使用動態 關鍵字預計將 變量包含這樣 爲對象從COM或DOM API 返回不確定類型的對象;從動態語言 (例如IronRuby)獲得;來自 的反思;從構建的對象 動態在C#4.0中使用新的 擴展功能。

Using the Dynamic Keyword in C# 4.0

+3

+1。好文章。特別是關於'var vs. dynamic',因爲很多人認爲他們是一樣的。 – 2011-06-14 17:02:47

2

它在COM互操作的情況下,您通常需要編寫大量的互操作相關的代碼特別有用。

+0

DIAF DTE [。](http:// derp) – Will 2011-06-14 17:02:25

0

DLR(動態語言運行時)基本上使每個人都可以與每個人交談。這不僅包括Python和Ruby,還包括Silverlight,Office/COM等。

+0

這也是一個很好的閱讀http://www.hanselman.com/blog/C4AndTheDynamicKeywordWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx – BentOnCoding 2011-06-14 17:00:50

+1

C#'dynamic' keyword!= DLR。 – delnan 2011-06-14 17:01:23

0

克里斯提到它在COM互操作場景中非常有用。

另外,它對非常有用。您可以通過動態模型獲得視圖。你也有ViewBag對象,可以容納任何東西。

另一個用途是舉行json object, if you implement a DynamicObject class。在使用API​​時,這是非常有用

+0

我一直在MVC視圖模型使用的動態頗爲失望。它非常容易受傷。你不能傳遞到動態擴展方法,這意味着你需要將其轉換爲已知類型的方法的HtmlHelper使用,並且當它們被編譯爲內部不能傳遞匿名類型爲動態視圖。這是聽起來不錯的東西之一 - 但實際上並非如此。 – 2011-06-14 17:09:11

+0

@詹姆斯測試一個匿名對象和真的不起作用。我記得另一個用於動態的應用,並補充說。 – BrunoLM 2011-06-14 17:19:54

1

我發現最實際的用途是處理COM互操作場景。許多傳統COM組件最終生成的簽名無法通過託管代碼進行大量投射,原因是許多項目被編組爲object。它導致如下代碼。

IUser GetAUser() { ... } 
IUser user = GetAUser(); 
IAddress address = (IAddress)user.GetAddress(); 
int zipCode = (int)address.GetZipCode(); 

對於深層嵌套的層次結構,情況會變得更糟。雖然這段代碼是類型安全的,但它並沒有違反任何CLR規則,但它是不安全的,因爲開發人員依賴於類型的實現細節來完成工作。它並不比動態等價物更安全。

dynamic GetAUser() { ... } 
int zipCode = (int)GetAUser().GetAddress().GetZipCode(); 
+0

不示例代碼動態版本違反「兩點」禁止寫入COM-互操作代碼(即生成的代碼「隱藏」的RCW)? – 2013-09-03 21:09:35

0

當您有幾個方法重載並且您已將該參數作爲對象接收時,對POCO使用dynamic關鍵字可能非常有用。將參數強制轉換爲動態參數,它將根據運行時類型解析正確的重載 - 沒有動態的情況下最終會產生一系列if/elseif語句,yuck。

使用與DynamicObjects子類的動態關鍵字可以讓你擺脫鍋爐板,更容易寫出流暢的API和創建代碼,是迄今爲止更具延展性。例如,這裏是一個動態api,擺脫了與MVVM綁定有關的大量樣板代碼http://code.google.com/p/impromptu-interface/wiki/UsageMVVM