だから私は C# で最初の一歩を踏み出し、簡単なタイル パズルを作っていました。タイルの位置をモデル化していたとき、値のセマンティクスが必要でした。したがって、私が見る限り、これを行うには基本的に構造体を使用する方法とタプルを使用する方法の 2 つがあります。
タプルの場合、私のコードは次のようになります。
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); } }
タプルはより簡潔ですが、H および V コンポーネント プロパティをそれらの周りに追加したにもかかわらず、パブリック API で混乱を招く可能性がありますItem1
。Item2
==
構造体にはさらにコードが必要で、 and をオーバーライドしているため、 Equals と GetHashCode をオーバーライドする方法についてコンパイラの警告が表示されますが、そうすると!=
、構造体を使用しても何も得られません (セマンティックおよび構文の観点から) ) 従来のクラスとまったく同じコードになるためです。
Item プロパティのノイズがないこと以外に、サブクラス化された Tuple よりも struc を使用する利点はありますか?
私のソリューションは両方とも期待どおりに動作しますか、それとも注意すべきニュアンスはありますか?