2013-04-24 10 views
1

Я использую Visual Studio 2012 Express с проектом C#. Кажется, я помню, что это не было в предыдущих версиях визуальной студии, и мне интересно, является ли это ошибкой.Метод в поле readonly может изменить метод вне конструктора?

В коде ниже Empty статическое поле только для чтения, но может быть изменен вне это конструктор с 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

ну, это ссылочный тип, поэтому я не особо удивлен этим –

+0

да, я считаю, что объект может манипулировать собой после его установки, однако сам объект не может быть изменен, например, если он был string, и вы пытаетесь сделать «x =» hello »;' он потерпит неудачу. – Timmerz

+0

Вызов метода мутации (но не средства настройки свойств) всегда разрешался. Но компилятор должен вставить защитную копию, поэтому исходное поле не будет изменено - изменяется только копия. Можете ли вы проверить, что поле изменилось? Если да, я бы подумал, что это ошибка. – CodesInChaos

ответ

3

Ваш фактически не изменяя поле, ваш вызов метода объекта.

Изменение было бы что-то вроде

Empty = null; 
+0

'Box' - это структура, поэтому ваш аргумент не применяется. – CodesInChaos

1

Ключевое слово readonly только утверждает, что ссылка (в случае ссылочного типа) к экземпляру может быть установлен только с помощью конструктора. Ключевое слово readonly ничего не говорит о том, что происходит внутри экземпляра.

В случае типов значений: readonly гарантирует, что конструктор onyl может установить тип значения, но он не гарантирует, что сам тип значения не может изменять собственные значения изнутри.