使用引用类型成员定义结构是否有意义?

Yan*_*hof 19 .net clr struct value-type reference-type

在定义具有引用类型成员的结构(而不​​是将其定义为类)时是否有任何意义?例如,要定义此结构:

public struct SomeStruct
{
    string name;
    Int32  place;
}
Run Code Online (Sandbox Code Playgroud)

我问,因为我知道结构是一个值类型,并在其中定义一些引用类型没有任何意义.

我对吗?有人可以解释一下吗?

Cod*_*ray 22

十分之九,你应该首先创建一个类而不是一个结构.例如,与C++中的结构相比,结构和类在C#中具有非常不同的语义.大多数使用结构的程序员都应该使用一个类,这样的问题就像坦率地说无关紧要.

以下是关于何时应该在类上选择结构的一些快速规则:

  1. 决不.
    ......哦,你还在读书?你坚持不懈 好的.
  2. 当您明确需要值类型语义时,而不是引用类型语义.
  3. 当你有一个非常小的类型(经验法则是一个小于16字节的内存占用).
  4. 当你的struct表示的对象将是短暂的和不可变的(不会改变).
  5. 偶尔,与使用结构的本机代码互操作.

但是,如果你已经做出了明智的决定并且确实相信你确实需要一个结构而不是一个类,那么你需要重新考虑第二点,并了解什么是值类型语义.Jon Skeet的文章在澄清区别方面应该有很长的路要走.

完成后,您应该理解为什么在值类型(struct)中定义引用类型不是问题.引用类型就像指针一样.结构内部的字段不存储实际类型; 相反,它存储指向该类型的指针(或引用).使用包含引用类型的字段声明结构没有任何矛盾或错误.它既不会"减慢对象",也不会"调用GC",这是你在评论中表达的两个问题.

  • 当你有一个非常小的类型(经验法则是一个小于16字节的内存占用). - 你能描述一下16bytes的原因吗?实际上为什么尺寸很重要? (3认同)