类与结构

时间:2014-01-17 12:41:25

标签: c#

将这两个用作参考

Immutable class vs struct

http://msdn.microsoft.com/en-us/library/ms229017(v=vs.110).aspx

我想知道我的建议是什么(最好是为什么)。我目前正在构建库存管理器,添加,删除,移动,删除项目。 (稍后会装备/装备,但它们不会直接与我的库存集成,因为库存只会管理删除(装备)和添加(非装备)

无论是类还是结构,这都是问题!

一个人指出一个8字节的限制,msdn说16.按Item类将会有更多的限制。

private string _name;
private string _desc;

private bool _dropable;
private int _price;
private int _maxQuantity;

我的ItemSlot结构/类将具有Item(或int _itemId)以及数量。应该(是的?)加起来超过16个字节。

private ItemSlot[] _inventory;

public const int INVENTORY_SIZE = 50;

public Party () {
    ItemSlot[] _inventory = new ItemSlot[INVENTORY_SIZE];
}

我试图遵循的教程系列使用了一个结构,但是;现在有了这些知识,我是正确的,我应该有一个项目插槽的课程?或者我的理解是否浅薄?

2 个答案:

答案 0 :(得分:6)

使用class

struct的建议大小不是因为可用内存(是的,如评论中Arun指出的那样,内存很便宜)..但真正的原因是因为struct s按值复制。这意味着每次你传递你的结构时......每个字段都会随之复制。因此,您到处看到的“struct字节限制”建议是为了避免这种情况。

另一方面,

class只复制引用的值...这是它运行的处理器的本机字大小..使复制操作几乎不可测量。

你说过你的结构会比16个字节大得多..这绝对是足以与class一起使用的原因,以避免在使用{{1}时复制整个内存块的开销}}

答案 1 :(得分:1)

正如其他人所说:不要太担心内存使用情况。或者更确切地说:担心重要的内存使用情况。 但真正重要的是:一个类是灵活的,结构不是。您需要稍后为数据添加一些逻辑,这可以通过类来实现,但不能使用结构。例如。一个类可以有一个方法,但不能有结构。

这可能是一个令人头疼的问题,我经常想到“该死的现在我必须提供一种方法来执行某些任务,现在我必须将此结构更改为类”。 所以我的经验法则是:

仅在以下情况下使用结构:对方法或复杂的getter / setter没有可预见的需求,并且数据非常小并且不太可能增长。 “和子句”来自这样一个事实:无论你现在在想什么,复杂的结构在未来都会得到一种方法。

如果你研究一下网络框架,几乎在任何地方都会使用类,其中结构只用于非常小的相关数据,如Point(x和y坐标)