使用引用类型成员定义结构是否有任何意义(而不是将其定义为类)?例如,要定义此结构:
public struct SomeStruct
{
string name;
Int32 place;
}
我问,因为我知道结构是一种值类型,并且在其中定义一些引用类型没有任何意义。
我是对的吗?有人可以解释一下吗?
答案 0 :(得分:19)
十分之九,你应该首先创建一个类而不是一个结构。结构和类在C#中的语义非常不同,与你在C ++中可以找到的相比,例如。大多数使用结构的程序员应该使用了一个类,这样的问题就像坦率地说无关紧要。
以下是关于何时应该选择某个类的结构的快速规则:
但是如果你做了informed decision而且确信你做,事实上,需要一个结构而不是一个类,你需要重新审视第二点并理解什么值类型语义。 Jon Skeet's article here应该在很大程度上澄清这种区别。
完成后,您应该理解为什么在值类型(struct)中定义引用类型不是问题。引用类型就像指针一样。结构内部的字段不存储实际类型;相反,它存储指向该类型的指针(或引用)。使用包含引用类型的字段声明结构没有任何矛盾或错误。它既不会“减慢对象”,也不会“调用GC”,这是你在评论中表达的两个问题。
答案 1 :(得分:3)
声明引用类型的字段意味着需要有空间来保存指向目标对象的引用的值。因此,在结构中使用这些字段是完全合理的。
答案 2 :(得分:2)
我很想知道更有经验的程序员对此的优缺点所说的,但我的理解是,作为一种值类型,将从堆栈中分配一个SomeStruct
类型的变量,但会包含对包含字符串的堆上位置的引用。
答案 3 :(得分:2)
通常,如果满足下列条件之一,结构应仅包含引用类型的公共和/或可变字段:
如果两种条件均不适用,则在满足以下所有条件的情况下,结构可能适合保留参考类型的字段:
换句话说,用于封装对象状态的对象引用(而不仅仅是识别它)应该只存储在struct字段中,如果没有执行路径,通过该对象引用它引用的对象可能会被修改。