所以我在 C# 中迈出了第一步,并且正在制作一个简单的拼图。当我对瓦片的位置进行建模时,我想要具有值语义。所以,据我所知,基本上有两种方法可以做到这一点,使用结构或使用元组。
在元组的情况下,我的代码如下所示:
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); } }
元组更简洁,但它公开Item1
并且Item2
在公共 API 中会造成混淆,即使我在它们周围添加了 H 和 V 组件属性。
该结构需要更多代码,并且我收到一个编译器警告,提示我应该如何覆盖 Equals 和 GetHashCode 因为我正在覆盖==
and !=
,但是如果我这样做了,我不会从使用结构中得到任何东西(从语义和句法的角度来看) ) 因为它与传统类的代码完全相同。
那么除了没有 Item 属性的噪音之外,在子类 Tuple 上使用 struc 有什么好处吗?
我的两个解决方案的行为方式是否与我预期的相同,或者是否有我应该注意的细微差别?