2013-06-05 105 views
0

所以我一直试图让我的头周围这个周。我知道结构是值类型,而类是引用类型。我感到困惑的地方在于两者之间的行为差​​异。结构和类/值类型与引用类型

例如: 如果我有一袋土豆,并且每个马铃薯是不同的大小,形状和重量... 该袋将是一个“类” /引用类型 土豆将是一个“结构'/值类型

我的马铃薯可以是一个类,或者他们必须是一个结构,因为其中包含的值是不同的?

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

谢谢!

+12

我非常怀疑“我的土豆能成为一个班级吗?”这个问题的答案。清除任何东西。 – Henrik

+2

请记住基于语言的值/引用类型与逻辑值/引用类型之间的差异。一个'class'在逻辑上可以是一个值类型,并且在内部维护参考概念,如相等/不变性等。 – David

+0

考虑结构类型:int,float,decimal,Color。以及类型的东西:'Form','Page','StackPanel','Socket'。 –

回答

5

如果所有跟踪的土豆都是它们的大小,重量和形状,那么回答这个问题 - “如果两个土豆的大小,重量和形状相同,它们应该被认为是相同的吗? ”。这个问题的答案取决于你的问题领域。

如果他们应该是“相同的”,那么你通过进行比较,并且(通常)可以/应该是值类型。如果他们不应该被视为“相同”,那么他们应该是参考类型。

+2

我同意,虽然我认为身份的概念是否与参考或值类型是正交的。我引用了'string'类的例子,它是一个引用类型,但它的行为类似于一个值类型。但你确实说“一般”,所以我同意。 :) –

+0

是的,我不会依赖讨论*比较*,因为您可以非常高兴地通过值比较参考类型... – Rawling

+2

使“身份”与值类型冲突。没有标识(字符串)不与引用类型冲突。 –

0

任何是struct的东西都可能是class。两者的表现微妙不同,但你的“土豆”当然可以是class而不是struct

+6

我不同意,土豆本质上是价值类型。我认为你对西红柿感到困惑,西红柿绝对是参考类型。 – Rotem

1

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

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

  • 如果它是一个引用类型 - 然后改变任何值将也BagOfPotatoes被改变。即Potato.IsSkinned = true

  • 如果它是一个价值型 - 然后BagOfPotatoes仍然会包含一个袋子与原Potato S,即Potato.IsSkinned = false

它deppends你是否需要指马铃薯作为个人马铃薯,在那里你可以看到它,并且在它的结尾处仍然谈论相同的马铃薯泥(,通过参考)。或者您是否只想谈谈马铃薯类型,价值)。

+2

+1,用于做出可怕的比喻。 – Joe