gpt4 book ai didi

c# - C# 结构与元组中的值语义

转载 作者:行者123 更新时间:2023-11-30 13:59:01 30 4
gpt4 key购买 nike

因此,我正在迈出 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);
}
}

元组更简洁,但它公开了 Item1Item2,这在公共(public) API 中会造成混淆,即使我在它们周围添加了 H 和 V 组件属性。

该结构需要更多代码,并且我收到编译器警告,提示我应该如何覆盖 Equals 和 GetHashCode,因为我正在覆盖 ==!=,但是如果我这样做我没有从使用结构中得到任何东西(从语义和句法的角度来看),因为它与传统类的代码完全相同。

那么,除了没有 Item 属性的噪声之外,在子类元组上使用结构还有什么好处吗?

我的两个解决方案的行为方式是否与我预期的相同,或者是否存在我应该注意的细微差别?

最佳答案

(顺便说一句,最好在这两种情况下都实现 IEquatable<TilePosition> - 特别是在结构情况下,以避免装箱。)

So are there any benefits from using a struc over a subclassed Tuple aside from not having the noise of the Item properties?

鉴于它是不可变的,在这两种情况下你都有大致的“值语义”,但仍然存在差异......

  • 类类型的实例需要堆空间(假设 CLR 没有进行逃逸检测等);结构类型的值可能在某些情况下只使用堆栈
  • 传递类类型的值意味着传递引用(4 字节或 8 字节,具体取决于 CLR 体系结构);传递结构类型的值确实传递了值(所以 8 个字节)
  • 在类类型版本null是一个有效值;在结构类型版本中,您需要使用 TilePosition?指示可能不存在的值
  • 在结构版本中new TilePosition()有效且两个字段的值为 0(这将是默认值,例如字段和数组元素)
  • 因为你还没有密封你的类,有人可以创建一个可变的子类;因此,客户认为它是完全不可变的是安全的。 (你可能应该把它封起来……)
  • 您可以将您的类类型与任何使用 Tuple<,> 的代码一起使用,而结构类型显然不是这种情况
  • ==的含义两种类型之间会有所不同。即使你重载 ==在类类型中,调用者仍然可能只是比较引用。在 struct 的情况下,您仍然可能最终比较盒装引用,但毫无帮助。

当然,这些只是差异 - 它们是否算作一种方法或另一种方法的好处取决于您的要求。

关于c# - C# 结构与元组中的值语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14502112/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com