2011-01-19 49 views
10

我的問題是:在C#中,使用的值類型與引用類型

  • 我們什麼時候應該使用值類型和引用類型時?
  • 其中一個優點和缺點是什麼?
  • 如果在任何地方都使用參考類型會怎樣?它有什麼傷害嗎?

請同時討論每一個的優缺點。我也想明白這一點。

+2

如果你不能決定,它幾乎肯定是一個`類`。 *合法*寫一個結構是非常罕見的。 – 2011-01-19 19:10:15

+1

對於土耳其程序員,我有一篇關於它的博客文章http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ – 2012-12-06 16:04:49

回答

4

對此,似乎存在很多混淆,Jon Skeet在他的書「C#深度第二版」中做了很好的清理工作。 (第2.3節)。

我個人的方法可能是也可能不是正確的,只是使用結構體/枚舉(值類型)來表示輕量級的原子數據結構,我知道我會經常以某種邏輯或數學方式使用操作 - 認爲Point

這樣我我可以避免垃圾收集性能的損失。然而,Jon在他的書中指出,沒有真正的保證,特別是在新版本的運行時中,是否會出現一些問題。

所以我最好的答案是謹慎使用結構,並且要非常清楚你爲什麼要使用它們。注意過早優化。在Jon的書中閱讀這部分,如果你能得到一份副本,因爲他在澄清這整個主題方面做得很好。

相關:When to use struct?

7

使用不具有自己身份的不可變對象的值類型(a 1是1),對其他事物使用引用類型。

+5

字符串是否有身份? :) – 2011-01-19 18:39:46

2

http://www.albahari.com/valuevsreftypes.aspx

這是我在這一點上的參考。我主要使用參考類型tbh。 IE類而不是結構。常常要說的主要觀點是結構只應用於小塊信息。真的取決於具體情況。看看對象瀏覽器中的.net框架應該有所幫助,你會看到微軟的人做了什麼,你可以分析爲什麼他們做了某些類和結構。

1

不可變值類型和不可變的引用類型是語義上所有的但相同的;唯一的區別是引用類型支持可能有意義或不可能有意義的引用相等性檢查,並且值類型可能包含在Nullable(Of T)中,而引用類型可隱式地爲空。如果一個類型是不可變的,取決於它將如何使用,可能會有性能方面的原因來支持結構或類;對於某些操作(幾乎所有操作,對於小於四個字節的大小),結構體的速度更快,而對於其他類(特別是對於大於16字節的東西),類可能會更快。而且,一些類型的操作在結構中基本上是不可能的。

與一些反對者聲稱相反,可變結構類型很有用,但有一些注意事項。如果有一個變量持有對可變類對象的引用,並且有人做了某件事情來更改該對象,那麼該變更將有效地被持有該對象引用的所有內容「看到」。如果一個人希望改變一個物體而不打擾其他物體,那麼必須知道一個物體只能提到該物體。通常,確保這一點的唯一方法是將對象中的所有數據複製到新的對象實例中,然後對該新實例進行更改。相比之下,如果有一個可變的結構體,可以簡單地進行任何需要的更改,而無需創建新的實例。

可變結構唯一真正的問題是.net使用各種抽象使它們表現爲統一類型系統的一部分,並且這些抽象可能導致結構的副本用於邏輯上應該使用原件的地方。當這些替換可能發生時,並不總是很明顯,並且會導致混淆和錯誤的行爲。