2014-10-26 21 views
0

我期望這很簡單,但由於某種原因,我找不到任何可變結構與不可變結構之間區別的明確例子。我已經讀過,我創建的任何結構都應該是不可變的,以防止將來任何混淆。回首這是我一直在努力則顯得我創建了一個可變的結構:無法理解不可變結構的正確實現?

public struct Connection 
    { 
     public int x, y; 
     public float strength; 

     public Connection(int x, int y, float strength) 
     { 
      this.x = x; 
      this.y = y; 
      this.strength = strength; 
     } 
    } 

從我已閱讀,使我的結構不變的應該是如下:

public struct Connection 
    { 
     public readonly int x, y; 
     public readonly float strength; 

     public Connection(int x, int y, float strength) 
     { 
      this.x = x; 
      this.y = y; 
      this.strength = strength; 
     } 
    } 

然而,當通過dotnetperls閱讀時我變得很困惑,那裏使用的例子似乎基於我讀過的內容是可變的。

對不起,這是一個新手問題。任何幫助不勝感激。

回答

2

對於不可變的結構,所有實例字段/屬性都標記爲只讀。你是對的:你問題中的第一個例子是可變的,而第二個例子是不可變的。

不可變結構在處理異步/多線程代碼時提供了許多優點,但正如名稱所暗示的,它們的值不能更改。這對於結構體來說並不是一個大問題,但是當將相同的方法應用於通過引用傳遞的類時,這可能會產生問題。

+0

非常感謝。我太多了新用戶給你一個投票!有精神:) – 2014-10-26 20:36:45

+0

@AndrewScott非常感謝! :) – Zenexer 2014-10-26 20:49:09

0

有兩種主要情況適合使用結構:(1)需要一堆變量與膠帶粘在一起; (2)一個人想要一個小的不可變對象。沒有看到你的類型是如何使用的,我無法判斷哪種情況適用。

如果一個類型的目的是像一堆用膠帶粘在一起的變量,那麼前面的聲明在這方面是完美的,因爲任何知道.NET中結構類型的人都會立即能夠看看它,並告訴它它代表了一堆粘在一起的變量,並且其行爲與其他任何類型的行爲完全相同,只保存封裝字段的名稱和類型。

如果希望類型的行爲類似於不可變對象,那麼實現該類型的最簡單方法可能是隻讀字段。請注意,這樣做實際上並不會使結構不可變,因爲沒有像不可變結構這樣的東西。如果存在定義爲Connection c1, c2;的某個地方存在兩個字段,則語句c1=c2;將通過覆蓋c1的所有字段(公開和私人字段),並使用相應字段c2的值來變異。 .NET框架將僅檢查Connection類型以確定所有字段的總大小;它不會關心「只讀」聲明或任何其他可能試圖放在字段上的保護。

+0

謝謝超級貓。這揭示了一些事情。我會小心使用結構。 在這種情況下使用數據是將這些簡單的信息存儲在一個巨大的「連接」列表中。連接被隨機地做成0和1之間的隨機強度的x和y座標。 如果我可以的話,我會upvote你:) – 2014-10-27 20:09:48

+0

@AndrewScott:作爲一個結構還是一個類會更好取決於您希望該類型代表無線電收發器,或者在某個時刻發送或接收信號。就個人而言,我喜歡擁有一個類,它將信息保存在同一個源文件中定義的開放域結構中,但很大程度上取決於使用情況。 – supercat 2014-10-27 20:39:23

相關問題