我读了When should I use a struct instead of a class?,其中引用了MSDN的指导,该指导表示:
除非类型具有以下所有特征,否则不要定义结构:
- 它在逻辑上代表单个值,类似于原始类型(整数、双精度等)。
- 它的实例大小小于16字节。
- 它是不可变的。
- 它不必频繁地装箱。
而Why are mutable structs “evil”?有答案:
结构体是值类型,这意味着它们在传递时被复制。
我很难理解为什么我不应该只意识到结构体需要按引用传递,否则通过函数传递的版本所做的更改不会影响原始版本。是的,我以前遇到过很多此类错误,但现在我足够有经验,小心不让它发生。
我只在C#中制作游戏,并且游戏中的东西需要经常更改。
假设我有一个玩家角色,由我的游戏中的类“Player”表示。如果Player有变量X和Y来表示其位置,这些将经常更改。我不想每次移动时都创建一个新的Player,以保持不可变性?因此,我的类应该是可变的。好的。
但是,如果我想存储有关实体的数据。如果我在矩形(x、y、w、h)中存储其在屏幕上的位置,我应该将Rectangle设置为类,因为它将是可变的吗?它只是4个变量的逻辑集合,因此对我来说,结构体似乎是一个明智的容器。
我还有一个结构体“Colour”(r、g、b、a),但我将其设置为可变的,因为我可能想要移动游戏中的事物的alpha值以使它们淡入/淡出,或者在受伤时将某些东西变成红色,而无需调用“new Colour”每个渲染调用的开销。
我看到另一篇帖子说,如果满足以下条件,则应使用结构体:
- 类型的主要责任是数据存储吗?
- 它的公共接口是否完全由访问或修改其数据成员的属性定义?
- 您确定您的类型永远不会有子类吗?
- 您确定您的类型永远不会以多态方式处理吗?
对于我使用的结构体,这个答案是“是”,但其中大多数都是可变的。
我对所有这些相互矛盾的建议感到困惑。对于某些类型的使用,可变结构体是否可以接受,还是我的代码设计完全错误?
var ds = new DateTime[1000];
在堆上分配了1000个结构体。 - Asik