所以我正在C#中開始我的第一步,並且正在製作一個簡單的拼圖遊戲。當我建模瓦片的位置時,我想要具有價值語義。所以,就我所見,基本上有兩種方法可以做到這一點,一個結構或一個元組。c#struct vs tuple中的值語義
元組的情況下,我的代碼看起來是這樣的:
public class TilePosition : Tuple<int,int> { public int HComponent{get { return Item1; }} public int VComponent{get { return Item2; }} public TilePosition(int horizontalPosition, int verticalPosition) : base(horizontalPosition, verticalPosition) { } }
的結構解決方案是這樣的:
public struct TilePosition { private readonly int hComponent; private readonly int vComponent; public int HComponent { get { return hComponent; } } public int VComponent { get { return vComponent; } } public TilePosition(int hComponent, int vComponent) { this.hComponent = hComponent; this.vComponent = vComponent; } public static bool operator ==(TilePosition position1, TilePosition position2) { return position1.Equals(position2); } public static bool operator !=(TilePosition position1, TilePosition position2) { return !(position1 == position2); } }
元組是conciser但它暴露了Item1
和Item2
這將混淆在一個公共API,即使我已經在它們周圍添加了H和V組件屬性。
該結構需要更多的代碼,我得到了一個關於如何重寫Equals和GetHashCode的編譯器警告,因爲我重寫了==
和!=
,但如果我這樣做,我沒有從使用結構(從語義和句法的觀點),因爲它將與傳統類完全相同的代碼。
因此,除了沒有Item屬性的噪音之外,使用struc而不是使用子類Tuple還有什麼好處?
我的解決方案的行爲方式與我預期的一樣嗎?還是存在細微差別我應該注意?
你爲什麼說從元組''<,>給你「值語義」獲得。 'Tuple <,>'類是一個引用類型,當然你的派生類也是一個引用類型。 –
元組是一個引用類型,所以使用==比較兩個tile位置會比較引用,而不是X和Y座標的值。我認爲這不是你想要的? –
這可能是他想要的,如果兩個瓷磚不允許佔據相同的空間。位置相同(也參考)意味着它們佔據相同的空間。 – MrFox