什么时候应该在C#中使用结构而不是类?我的概念模型是,当项只是值类型的集合时,使用结构。一种将它们逻辑地结合在一起的方法。

我在这里遇到了这些规则:

结构应表示单个价值结构应具有内存占用空间小于16字节。结构不应在之后更改创造

这些规则有效吗?结构在语义上意味着什么?


当前回答

当您需要值语义而不是引用语义时,请使用结构。

如果需要引用语义,则需要类而不是结构。

其他回答

除了“它是一个值”的答案之外,使用结构的一个特定场景是当您知道有一组数据会导致垃圾收集问题,并且您有很多对象时。例如,Person实例的大列表/数组。这里的自然隐喻是一个类,但如果您有大量长寿的Person实例,它们可能会阻塞GEN-2并导致GC暂停。如果场景允许,这里的一种潜在方法是使用Person结构的数组(而不是列表),即Person[]。现在,在GEN-2中没有数百万个对象,而是在LOH上有一个块(我假设这里没有字符串等-即没有任何引用的纯值)。这对GC的影响很小。

处理这些数据是很困难的,因为数据对于一个结构来说可能太大了,而且您不想一直复制胖值。然而,直接在数组中访问它不会复制结构-它是在适当的位置(与列表索引器不同,它会复制)。这意味着大量的索引工作:

int index = ...
int id = peopleArray[index].Id;

请注意,保持值本身不可变将有助于此。对于更复杂的逻辑,请使用带有by-ref参数的方法:

void Foo(ref Person person) {...}
...
Foo(ref peopleArray[index]);

同样,这是正确的-我们没有复制值。

在非常具体的情况下,这种策略可能非常成功;然而,这是一个相当先进的scernario,只有当你知道自己在做什么和为什么时,才应该尝试。这里的默认值是类。

这是一条基本规则。

如果所有成员字段都是值类型,则创建一个结构。如果任何一个成员字段是引用类型,请创建一个类。这是因为引用类型字段无论如何都需要堆分配。

Exmaples公司

public struct MyPoint 
{
    public int X; // Value Type
    public int Y; // Value Type
}

public class MyPointWithName 
{
    public int X; // Value Type
    public int Y; // Value Type
    public string Name; // Reference Type
}

第一:互操作场景或需要指定内存布局时

第二:当数据大小与引用指针几乎相同时。

我很少对事物使用结构。但这只是我,这取决于我是否需要对象为空。

如其他答案所述,我对真实世界的对象使用类。我也有结构用于存储少量数据的想法。

我刚刚在处理Windows Communication Foundation[WCF]命名管道,我注意到使用Structs确实有意义,以确保数据交换是值类型而不是引用类型。