[英]C# struct best practices, possible contradiction?
我知道C#結構上大約有1,000個問題。 我想進行迭代,以了解值語義,stackallocs的性能優勢等。我的具體問題來自於這篇msdn文章,有關何時在類上使用結構。 MSDN結構與C#類
首先,他們談到了容器(尤其是數組)的內聯數據的好處。 一種分配,以及數組中所有結構的用戶無法定義的默認初始化。 但是,他們也強調結構應該是不變的。
如果我聲明一個mystuct[] s = new mystruct[16];
,我有16個mystruct
,其默認值是內聯的。 如果我按照建議創建了沒有外部可變性的“潔凈”結構,那么該結構對我有什么用? 我懷疑我打算專門包含一個0積分和null的數組。
當僅用作記錄或屬性返回(即單一數據傳輸)時,它們是否意味着不可變?
如果之前已經解決了默認數組初始化與建議的不可變性之間的特定沖突,請標記為重復。 感謝您的見解。
兩者之間沒有實際的矛盾:
完成后var s = new mystruct[16];
,的確,您已經將mystruct
的16個實例和數組初始化為默認值。
但是,執行s[0] = new mystruct(<arguments list here>)
不會使數組第一個單元格的結構發生突變,而是將其替換為新的結構。
因此,自身的結構仍然是不可變的。
討論的不變性是通過結構的方法,而不是結構本身的值。 一個結構體的實例總是可以通過賦值來進行突變-考慮一下for循環中的整數循環變量; 它在每次循環中都會更改。
但是,對於框架的System.Int32
結構(即int
)來說,使用DoubleIt
方法導致基礎整數的值加倍而無需進行一些明顯的賦值操作(如++i;
實際上是i=i+1;
)。
考慮一下string.Replace
和StringBuilder.Replace
之間的區別。 System.String
類是不可變的。 字符串上的Replace方法返回一個新的字符串實例,該實例表示替換操作后的原始字符串。 StringBuilder的Replace會進行替換,從而使內部對象發生變異。
因此,如果我創建一個整數數組:
var ar = new int[] {1, 2, 3, 4};
我總是可以通過數組分配來改變該數組的內容(一個System.Array實例,一個引用類型):
ar[2] = 200;
沒有意義的是在那個(整數)數組元素上調用某種變異方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.