亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么C#結構是不可變的?

為什么C#結構是不可變的?

ABOUTYOU 2019-11-27 10:42:21
我只是想知道為什么結構,字符串等是不可變的?是什么原因使它們不可變,而其余對象卻可變。什么被認為使對象不可變?為可變和不可變對象分配和釋放內存的方式有何不同?C# .NET 不變性
查看完整描述

3 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

結構不是...這就是為什么可變結構是邪惡的。

創建可變結構會導致應用程序中各種奇怪的行為,因此,它們被認為是一個非常糟糕的主意(這是因為它們看起來像引用類型,但實際上是一個值類型,并在每次傳遞時都會被復制)他們周圍)。

另一方面,字符串是。這使它們具有固有的線程安全性,并允許通過字符串實習進行優化。如果您需要即時構造復雜的字符串,可以使用StringBuilder。


查看完整回答
反對 回復 2019-11-27
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

當應用于結構和類時,可變性和不變性的概念具有不同的含義??勺冾惖囊粋€關鍵方面(通常是關鍵的弱點)是,如果Foo有一個Bartype 字段List<Integer>,它包含對包含(1,2,3)的列表的引用,其他對同一列表進行引用的代碼可以對其進行修改,這樣Bar可保存對包含(4,5,6)的列表的引用,即使該其他代碼無權訪問Bar。相比之下,如果Foo具有Biz類型的字段System.Drawing.Point,則任何東西都可以修改其任何方面的唯一方法Biz將是對該字段具有寫權限。


結構的字段(公共字段和私有字段)可以通過任何可以更改存儲該結構的存儲位置的代碼進行更改,而不能通過不能更改存儲該結構的存儲位置的任何代碼進行更改。如果封裝在結構中的所有信息都保存在其字段中,則該結構可以有效地將不可變類型的控制與可變類型的便利相結合,除非以消除這種便利的方式對結構進行編碼(不幸的是,這是一些Microsoft程序員推薦的習慣)。


結構的“問題”是,當在只讀上下文(或不可變的位置)中在結構上調用方法(包括屬性實現)時,系統將復制該結構,在臨時副本上執行該方法,然后靜默運行丟棄結果。這種行為使程序員提出了一個不幸的想法,即避免變異方法出現問題的方法是使許多結構不允許分段更新,而通過簡單地用暴露字段替換屬性可以更好地避免問題。


順便說一句,有些人抱怨說,當類屬性返回方便地可變的結構時,對該結構的更改不會影響它所來自的類。我認為這是一件好事-返回的項目是一個結構,這一事實使行為明確(特別是如果它是一個暴露字段結構)。比較使用假設的struct和property的代碼片段Drawing.Matrix與使用該類在Microsoft實現的實際屬性的代碼片段:


//假設結構

公共結構{

  公眾持股量xx,xy,yx,yy,dx,dy;

} Transform2d;


//“ System.Drawing.Drawing2d.Matrix”的假設屬性

public Transform2d變換{get;}


//“ System.Drawing.Drawing2d.Matrix”的實際屬性

public float []元素{get; }


//使用假設的結構進行編碼

Transform2d myTransform = myMatrix.Transform;

myTransform.dx + = 20;

...使用myTransform的其他代碼


//使用實際的Microsoft屬性進行編碼

float [] myArray = myMatrix.Elements;

myArray [4] + = 20;

...其他代碼使用myArray

查看實際的Microsoft屬性,是否有任何方法可以確定寫入是否myArray[4]會影響myMatrix?即使查看http://msdn.microsoft.com/zh-cn/library/system.drawing.drawing2d.matrix.elements.aspx頁面,也有什么方法可說?如果該屬性是使用基于結構的等效項編寫的,則不會造成混淆;返回該結構的屬性將只返回六個數字的當前值。更改myTransform.dx只不過是對未附加到任何其他內容的浮點變量的寫操作。任何不喜歡變更myTransform.dx不會影響這一事實的人都myMatrix應該同樣生氣,因為寫作myArray[4]不會影響myMatrix或者,不同的是的獨立性myMatrix和myTransform是顯而易見的,而獨立myMatrix和myArray不。


查看完整回答
反對 回復 2019-11-27
  • 3 回答
  • 0 關注
  • 626 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號