2014-01-13 49 views
2

With dynamic我們幾乎有一個動態指針,但不完全是一個動態對象。 C#中真正的動態對象是ExpandoObject,但對大多數人來說,這是一個非常未知的類。 expando允許在運行時創建和刪除成員,就像散列(類似於JavaScript)。爲什麼匿名類型不像ExpandoObject那樣動態?

爲什麼ExpandoObject的優點是在一個單獨的類中實現的,而不僅僅是被假定爲匿名類型的一個特性?

也許這不會是一個好的舉措,因爲缺乏類型安全?或者可能由於(DLR)開銷涉及?

+0

我使用的匿名類型可能每天十幾次,但我只需要在過去的一年中使用ExpandoObject和動態少數幾次。換句話說,99%的時間[YAGNI](http://en.wikipedia.org/wiki/You_aren't_gonna_need_it) –

+0

匿名類型的類型在編譯時已知。他們不使用DLR。我不確定我看到了連接?請參閱http://stackoverflow.com/a/392163/453277 –

+2

「我們在C#中使用動態的大部分時間都是在處理匿名類型時。」什麼?在處理匿名類型時,你不應該使用'dynamic'。如果你是,你*錯誤地使用該功能*。匿名類型用於創建具有*編譯時類型安全*的簡單對象,在使用'dynamic'時,您可以直接從窗口拋出。 – Servy

回答

7

因爲匿名類型還有其他非常重要的功能 - 它們爲您提供編譯時安全類型。

而且因爲dynamic和匿名類型只是不同的概念。第一個可以讓你在運行時分派對象成員,第二個可以讓你創建帶有一些基本功能的靜態類型對象(相等,散列碼等),而不需要創建相應的POCO類。爲什麼他們應該以同樣的方式實施呢?

btw。我使用它們很多,真的很少需要使用dynamic來處理它們。你確定你正確使用這些語言功能嗎?

更新

我認爲這是匿名類型教程中非常重要的一部分:

如果您必須存儲查詢結果,或通過他們的方法邊界之外,可以考慮使用一個普通的命名結構或類而不是匿名類型。

+0

爲什麼我必須經常這樣做? – talles

+1

+1。 @talles - 我不認爲這個答案假定你使用頻率的任何事情(你的措詞也可能導致這樣的假設,特別是「主要...... *我們......」部分)。我猜'動態'不是來自強類型語言的人最喜歡的功能 - 所以你會得到無關的使用它的聊天。 –

+1

@AlexeiLevenkov我不介意在它被設計用於其中的情況下使用'dynamic'。匿名類型不適合'dynamic'。 – MarcinJuraszek