【问题标题】:Structs and Classes / value type vs refrence type [duplicate]结构和类/值类型与引用类型[重复]
【发布时间】:2013-06-01 03:49:26
【问题描述】:

所以几周来我一直在努力解决这个问题。我知道结构是值类型,而类是引用类型。我感到困惑的是两者之间的行为差​​异。

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

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

基本上,这个问题的答案会让我明白一切。

谢谢!

【问题讨论】:

  • 我非常怀疑“我的土豆可以上课吗?”这个问题的答案。清除任何东西。
  • 请记住基于语言的值/引用类型和逻辑值/引用类型之间的区别。 class 在逻辑上可能是一个值类型,并且在内部维护了引用概念,如相等/不变性/等。
  • 考虑结构体的种类:int, float, decimal, Color;以及类的种类:FormPageStackPanelSocket
  • 这篇文章很好地解释了何时使用struct:stackoverflow.com/questions/521298/when-to-use-struct-in-c
  • 主要区别在于“复制语义”:a = b; 究竟发生了什么取决于 rev 或值类型。

标签: c#


【解决方案1】:

如果你想从BagOfPotatoes 中取出Potato 并在其他类之间传递它,如果这些类要修改土豆,那么它应该是一个引用类型。

例如,BagOfPotatoes 被传递给 Chef.SortPotatoes(List<Potatoes> potatoes),然后继续到 Chef.SkinPotatoes(Potato potato),厨师可以在其中剥土豆皮,设置 Potato.IsSkinned

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

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

这取决于您是否需要将马铃薯称为单个马铃薯,您将它扔在哪里,但在它的末尾仍然谈论同一个土豆泥(引用)。或者您是否只想谈论它的马铃薯类型按价值)。

【讨论】:

  • +1 充分利用了一个糟糕的类比。
【解决方案2】:

如果您跟踪的所有关于马铃薯的信息都是它们的大小、重量和形状,那么请回答这个问题 - “如果两个马铃薯的大小、重量和形状相同,是否应该将它们视为是相同的?”。该问题的答案取决于您的问题领域。

如果它们应该“相同”,那么您将通过 value 和(通常)可能/应该是值类型来比较它们。如果它们不应该被视为“相同”,那么它们应该是引用类型。

【讨论】:

  • 我同意,尽管我认为身份的概念与某事物是引用类型还是值类型是正交的。我举了string 类的例子,它是一个引用类型,但它的行为就像一个值类型。但是您确实说“一般”,所以我同意。 :)
  • 是的,我不会依赖讨论比较,因为您可以很高兴地按值比较引用类型...
  • “身份”与值类型冲突。没有标识(字符串)与引用类型不冲突。
  • @HenkHolterman 是的,这使问题更容易回答。如果某物具有“身份”,那么它不能是值类型。
【解决方案3】:

任何struct 都可以改为class。两者的行为略有不同,但你的“土豆”肯定是class 而不是struct

【讨论】:

  • 我不同意,土豆本质上是价值类型。我认为您对西红柿感到困惑,这绝对是引用类型。
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
相关资源
最近更新 更多