簡體   English   中英

另一個“為什么結構不可變?”C#

[英]Another “Why shouldn't structs be mutable?” C#

我讀過什么時候應該使用結構而不是類? 參考MSDN的指導,其中說:

除非類型具有以下所有特征,否則不要定義結構:

  • 它邏輯上表示單個值,類似於基本類型(整數,雙精度等)。
  • 它的實例大小小於16個字節。
  • 這是不可改變的。
  • 它不必經常裝箱。

為什么可變結構“邪惡”? 有答案:

結構是值類型,這意味着它們在傳遞時被復制。

我很難理解為什么我不應該只是意識到結構需要通過引用傳遞,否則對通過函數傳遞的版本所做的更改不會影響原始版本。 是的,我過去曾經有過很多錯誤,但是現在我經驗豐富,我不小心不會發生這種錯誤。

我只使用C#制作游戲,游戲內容的變量需要改變很多。

假設我有一個玩家角色,在我的游戲中由“玩家”類代表。 如果玩家有變量X和Y來說明它的位置,那么這些變化會很大。 我不希望每次移動時創建一個新玩家,只是為了保持不變性? 所以我的班級應該是可變的。 好。

但是,如果我想存儲有關我的實體的數據,該怎么辦? 如果我在Rectangle(x,y,w,h)中將其位置存儲在屏幕上,我是否應該將Rectangle設為CLASS,因為它是可變的? 它只是4個變量的邏輯集合,因此結構對我來說似乎是合理的容器。

我也有“顏色”作為一個結構(r,g,b,a),但我有它可變,因為我可能想要改變游戲中的東西的α來淡入/淡出它們,或者將顏色變為紅色一秒鍾受到傷害,沒有每次渲染調用調用“new Color”的開銷。

我看到另一個帖子,如果符合這些條件,應該使用結構:

  • 類型數據存儲的主要責任是什么?
  • 它的公共接口是否完全由訪問或修改其數據成員的屬性定義?
  • 你確定你的類型永遠不會有子類嗎?
  • 你確定你的類型永遠不會被多態化處理嗎?

對於我使用的結構,這個問題的答案是肯定的,但是大多數結構都是可變的。

我對這里所有相互矛盾的建議感到困惑。 對於某些類型的使用,可變結構是否正常,或者我設計的代碼是錯誤的嗎?

這不僅僅是意外丟失信息的機會:

list.ForEach(item => item.X = 10);
// this code does nothing useful if item is a mutable struct

它也是變異方法和readonly之間奇怪的相互作用

readonly MutableStruct m_field;
...
m_field.MutatingMethod(); // mutates a temporary copy rather than the field

但是如果你通過剖析確定了:

  • 您無法負擔參考類型,因為,例如,GC壓力,或者您希望將所有對象放在數組中以獲得更好的局部性
  • 修改它時,您無法復制整個結構
  • 您無法合理地更改設計以解決這些問題(使結構更小,有一個引用類型對象池等)
  • 你知道你在做什么

然后可變結構可能是你需要的。 這就是為什么他們畢竟是這種語言的原因。

說到游戲代碼,SharpDX充滿了可變結構( 示例 )和通過引用傳遞的方法。

暫無
暫無

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

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