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