2013-04-24 18 views
1

我正在使用Visual Studio 2012 Express與C#項目。我似乎記得早期版本的Visual Studio中並非如此,我想知道這是否是一個錯誤。readonly字段上的方法可以修改構造函數之外的方法嗎?

在下面空的代碼是一個靜態只讀字段,但它的構造函數外()進行修改與Empty.Clear

public struct Box 
{ 
    public static readonly float D = float.MaxValue; 
    public static readonly Box Empty = new Box(new Vector3(D, D, D), new Vector3(-D, -D, -D)); 

    public Vector3 Min; 
    public Vector3 Max; 

    public Box(Vector3 min, Vector3 max) 
    { 
     Min = min; 
     Max = max; 
    } 

    public void Clear() 
    { 
     Min = new Vector3(D, D, D); 
     Max = -Min; 
     Empty.Clear(); // I seem to remember this should not be allowed 
    } 
} 
+1

好吧,它是一個引用類型,所以我並不特別感到驚訝,這個 – 2013-04-24 21:35:42

+0

是的,我相信對象可以在設置後自己操作,但是對象本身不能改變,例如,如果它是一個字符串,你試着做'x =「hello」;'它會失敗。 – Timmerz 2013-04-24 21:35:44

+0

一直被允許調用變異方法(但不是屬性設置器)。但是編譯器應該插入一個防禦副本,所以原始字段不會被更改 - 只有副本被更改。你能證實該領域得到改變嗎?如果是的話,我會考慮一個錯誤。 – CodesInChaos 2013-04-24 22:06:26

回答

3

你實際上沒有修改該字段,你調用對象的方法。

修改它會是這樣的

Empty = null; 
+0

'Box'是一個結構體,所以你的論點不適用。 – CodesInChaos 2013-04-24 22:06:57

1

關鍵字readonly僅指出參照(在引用類型的情況下)到一個實例只能由構造來設置。關鍵字readonly沒有說明實例內發生了什麼。

在值類型的情況下:readonly確保比onyl的構造函數可以設置值類型,但它不能確保值類型本身不能從內部更改其自己的值。

相關問題