关于C#:结构和类/值类型与引用类型


Structs and Classes / value type vs refrence type

本问题已经有最佳答案,请猛点这里访问。

所以我已经花了好几个星期的时间来思考这个问题了。我理解结构是值类型,类是引用类型。我感到困惑的是这两者在行为上的差异。

例如:如果我有一袋土豆,每个土豆的大小、形状和重量都不一样…该包将是"类/引用类型"土豆将是一个"结构/值类型"

我的土豆可以是一个类,还是必须是一个结构,因为其中包含的值不同?

基本上,这个问题的答案将为我澄清一切。

谢谢您!


如果你所追踪的关于土豆的所有信息都是它们的大小、重量和形状,那么回答这个问题:"如果两个土豆的大小、重量和形状相同,那么它们应该被认为是相同的吗?".这个问题的答案取决于你的问题域。

如果它们应该是"相同的",那么您将按值比较它们,并且(通常)可以/应该是值类型。如果它们不应该被视为"相同的",那么它们应该是引用类型。


如果你想把一个PotatoBagOfPotatoes中取出,在其他类之间传递,如果这些类要修改potato,那么它应该是一个引用类型。

例如,将BagOfPotatoes传递给Chef.SortPotatoes(List potatoes),然后继续到Chef.SkinPotatoes(Potato potato),厨师在那里剥土豆皮,放置Potato.IsSkinned

  • 如果它是引用类型,那么任何更改的值也将在BagOfPotatoes中更改。即Potato.IsSkinned = true

  • 如果它是一个值类型,那么BagOfPotatoes仍然包含一个带有原始Potatos的包,即Potato.IsSkinned = false

它取决于你是否需要将一个土豆称为一个单独的土豆,在那里你把它扔掉,并在它的末尾(通过引用)谈论同一个土豆泥。或者你是否只想谈论土豆的类型(按价值)。


任何是struct的东西都可以是class。这两个行为有细微的不同,但你的"土豆"肯定是一个class,而不是一个struct