繁体   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