2013-06-05 142 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