簡體   English   中英

有沒有辦法在C#中創建匿名結構?

[英]Is there a way to create anonymous structs in C#?

匿名類型從對象派生,似乎沒有任何方法。 但我想我會問,因為很多時候我們在簡單查詢表達式中使用匿名類型來提取要在我們創建的匿名類型中使用的數據子集。 在我看來,它們應該是結構(值類型),以提高內存效率與引用類型。

思考?

沒有沒有支持的C#語法會生成匿名結構

更新:C#7現在具有值類型元組,可以在使用引用類型匿名類型的相同類型的上下文中使用。


似乎有這種普遍認為的價值類型比參考類型“更有效”。 這完全是神話般的; 它們對某些操作更有效,而對其他操作效率更低。

例如,如果您關注的工作單元是“將值復制到新位置”工作,則大值類型與引用類型相比效率較低。 引用類型復制指針大小的引用,而不管引用數據的大小,因此復制在單個高度優化的機器指令中。 值類型每次復制數據的大小,這可能非常大並且需要多個指令。

無論如何,匿名類型僅僅是一種便利功能。 如果您不喜歡它們的性能特征,則不必使用它們。 如果您願意,可以定義自己的結構。

對於許多用例,如果實現為公共字段結構而不是不可變類,則匿名類型和元組將更有效; 特定的匿名類型或元組是否會更高效,因為這樣的結構或不可變類不是特別是它的大小的函數,而是它的使用方式的函數。 如果一個東西永遠不會被裝箱,那么使用結構與類的相對成本將取決於大小以及必須復制多少次(注意所謂的“不可變”結構通常必須比公共字段結構復制的次數多很多次。 如果一個東西在構造之后只被復制一次或兩次(在許多使用場景中很常見),那么幾乎任何大小的公共字段結構都將比不可變類表現得更好。 另一方面,如果事物經常被強制轉換為引用類型, 則不可變類將大大優於結構, 無論多小

將結構類型強制轉換為引用類型的代價,以及某些使用情況需要經常執行的事實,意味着即使對於大多數臨時對象結構而言,結構也比不可變類對象更有效,使用結構對於一切都不如為一切使用不可變的類對象。 結構允許整體性能提高10%或更多的用例可能太少,無法證明擁有兩種不同類型的元組和兩種不同類型的內置匿名類型的成本。 需要開放式結構的性能優勢的代碼可以很容易地為其確切目的定義結構類型。

你有沒有想過你的應用程序,發現匿名類型是最慢的部分? 如果是這樣,我建議你手動創建所需的結構並重新測試,看看是否能解決問題。 否則,我會花更多的時間來擔心手頭的業務問題和更少的打字時間(如功能允許)。

我有時使用匿名對象:

var x = new 
{
    itm0 = new { key = "key0", val = 0},
    itm1 = new { key = "key1", val = 1},
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM