2012-07-22 35 views
1

是否有人可以告訴我這是否可能。我正在從微軟的GameState看他們的XNA框架的代碼示例。在其中一個類中,他們使用「Public ReadOnly」數組成員。雖然不是一種促進面向對象的做法,但沒有任何問題。公共只讀數組成員 - 類之外的更新構造函數

該類稍後在構造函數中實例化它,到目前爲止狀態如此之好,它也記錄在MSDN上。

問題:類稍後在類方法中迭代數組,並更改數組中的數據。我查看了MSDN,並在Google上搜索了它,並且在我看來它說明問題將會出錯。是否有隻讀數組的特殊例外情況?

請指教。

public class InputState 
{ 
    public readonly KeyboardState[] CurrentKeyboardStates; 
    public readonly KeyboardState[] LastKeyboardStates; 

    public InputState() 
    { 
     CurrentKeyboardStates = new KeyboardState[max]; 
     LastKeyboardStates = new KeyboardState[max]; 
    } 
    //Does not make sense code... 
    public void Update() 
    { 
     for (int i=0; i < max; ++i) 
     { 
      //this should throw errors... 
      CurrentKeyboardStates[i] = LastKeyboardStates[i]; 
      LastKeyboardStates[i] = Keyboard.GetState(); 
      //more code.... 
     } 
    } 
} 
+0

http://msdn.microsoft.com/en-us/library/ms182299.aspx – SLaks 2012-07-22 22:31:49

回答

1

更改只讀數組的元素是完全沒有問題,你就不能重新分配參考。 (無法將CurrentKeyboardStates/LastKeyboardStates設置爲新數組等)。元素值可以更改。

+0

謝謝,我明白了。該數組是隻讀的,意味着不能重新分配數組,但可以更改元素。 – badboy11 2012-07-22 22:42:18

1

readonly變量不能被改變,則在構造函數中設置後。但是,在這種情況下,這是對數組對象的引用,其中可以更改爲

如果該字段是值類型(例如int),那麼您的理解成立。該字段可以由初始化程序或任何構造函數設置。這幾乎與const字段相同。

但是,如果它是一個參考,那麼我們可以保證的是,它將始終指相同的對象。是否可以修改該對象取決於它的實現。因此,在數組的情況下,例如,可以更改數組的內容,但不更改其長度。

請參閱readonly的MSDN文檔。

SLaks指出這將從代碼分析生成的警告:CA2105: Array fields should not be read only。這是爲了你在這裏提出的目的。標記數組readonly會給你一個錯誤的安全感,它不能被修改。但是,不能做的唯一的事情是給該字段分配一個不同的數組。


如果您想要公開的信息給外界一個數組,沒有它的可能性被改變,這樣做的最好辦法是IEnumerable<T>屬性:

public class Foo { 
    private int[] _data = new int[40]; 

    public IEnumerable<int> Data { 
     get { return _data; } 
    } 
} 

這將允許這個類的消費遍歷它,就像任何其他IEnumerable

Foo f = new Foo(); 
foreach (int d in f.Data) { 
    //... 
} 

f.Data[0] = 7;   // This won't work. IEnumerable doesn't have [] operator. 
f.Data = new int[10]; // This won't work. Data only has a getter. 
+0

好的,我明白了。不能更改/重新分配數組,但其元素可以更改。僅供參考 - 我確實看過你在回覆中鏈接的例子。它只顯示單個值而不是數組,這是我尋求幫助的原因。再次感謝,不要忘記忘恩負義。 – badboy11 2012-07-22 22:38:32

+0

你已經明白了。這是否適用於您的解決方案,還是需要**實際上只讀,就像您期望的那樣? – 2012-07-22 22:39:34

+0

正確 - 不用擔心,我**完全理解MSDN文檔的不足之處:-)我想我實際上看到了一個MSDN上的東西與SO相關的例子。 – 2012-07-22 22:50:07

1

就像其他兩張海報中提到的那樣,更改被引用的項目沒有任何問題。只讀時,您不能更改引用本身。

所以你想要的不是一個數組,它是可修改的,但是其他一些結構一旦定義就不可修改。我不會給你一個完整的解決方案,但你應該檢查出IEnumerableIEnumerator接口:http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx

+1

@ badboy11您正在將接受的答案從一個問題轉移到另一個問題。 (在3個答案中的每一個答案上都可以看到它。)你只能有1個被接受的答案,但是你可以贊成很多答案。所以選擇一個你認爲對你最有幫助的人。 ;-) – Mithon 2012-07-22 22:54:57

+0

對不起,我對投票感到困惑。所有的答案都很好,所以在選擇一個我感覺最爲明確和簡明的選擇時,不僅對我而言,而且在未來遇到這篇文章的任何人都很困難。 – badboy11 2012-07-22 23:46:10

相關問題