我已经读过了 When should I use a struct instead of a class? 它引用了MSDN的指导,其中说:
除非是,否则不要定义结构 type具有以下所有内容 特性:
- 它逻辑上表示单个值,类似于原始类型 (整数,双精度等)。
- 实例大小小于16个字节。
- 这是不可改变的。
- 不必频繁装箱。
和Why are mutable structs “evil”?已回答:
结构是值类型,这意味着它们在传递时会被复制。
我很难理解为什么我不应该意识到结构需要通过引用传递,否则对通过函数传递的版本所做的更改不会影响原始版本。是的,过去我有很多错误,但现在我经验丰富,我小心不要让它发生。
我使用C#专门制作游戏,游戏内容的变量需要改变很多。
说我有一个球员角色,由班级代表"玩家"在我的游戏中。如果玩家有变量X和Y来说明它的位置,那么这些变化会很大。我不想每次移动时创建一个新玩家,只是为了保持不变性?所以我的班级应该是可变的。行。
但是,如果我想存储有关我的实体的数据,该怎么办?如果我将它的位置以矩形(x,y,w,h)存储在屏幕上,我是否应该将Rectangle设为CLASS,因为它是可变的?它只是4个变量的逻辑集合,因此结构对我来说似乎是合理的容器。
我也有"颜色"作为一个结构(r,g,b,a),但我认为它是可变的,因为我可能想要改变游戏中的东西的α来淡入/淡出它们,或者当它受到伤害时将某些东西变成红色,没有调用"新颜色"每次渲染电话。
我看到另一个帖子说如果符合这些条件就应该使用结构:
- 类型数据存储的主要职责是什么?
- 其公共接口是否完全由访问或修改其数据成员的属性定义?
- 您确定您的类型永远不会有子类吗?
- 你确定你的类型永远不会被多态化处理吗?
答案是"是"对于我使用的结构,但大多数结构都是可变的。
我对这里所有相互矛盾的建议感到困惑。对于某些类型的使用,可变结构是否正常,或者我设计的代码是错误的吗?
答案 0 :(得分:3)
这不仅仅是意外丢失信息的可能性:
list.ForEach(item => item.X = 10);
// this code does nothing useful if item is a mutable struct
它也是the weird interaction between mutating methods and readonly
:
readonly MutableStruct m_field;
...
m_field.MutatingMethod(); // mutates a temporary copy rather than the field
但是如果你通过剖析确定了:
然后可变结构可能是你需要的。这就是他们毕竟使用这种语言的原因。
说到游戏代码,SharpDX充满了可变结构(example)和通过引用传递的方法。