2010-07-27 3 views
16

Имеют ли эти утверждения одно и то же?
Есть ли разница между readonly и {get; }

int x { get; } 
readonly int x; 
+0

Вам не нужно писать «int x {get; private set;}»? – jgauffin

+1

@jgauffin: Нет, если код находится в интерфейсе. –

+3

Я уверен, что вы не можете буквально иметь 'int x {get; } '(как свойство auto), так как нет способа установить его или сделать что-либо вообще. Это должно быть 'int m_x; int x {get {return m_x; }} '. –

ответ

23

В ответ на ваш вопрос: Там есть разница между чтением и {получить; }:

В int x { get; } (который не будет компилироваться, так как не существует способа установить й - Я думаю, что вам нужно public int x { get; private set; }) код может сохранить изменения X

В readonly int x; х инициализируются либо в конструкторе или инлайн а затем никогда не может измениться.

+4

с readonly x может быть задано только в конструкторе или в строке , –

+2

Возможно, вы хотите уточнить, что его «Нет» означает «Эти утверждения означают одно и то же», но «Да»: «Есть ли разница между readonly и {get; }». Возможно, название или встроенный текст следует изменить, чтобы сделать его немного менее запутанным. – SwDevMan81

+1

'readonly' его важно понять, что его можно инициализировать только в конструкторе. –

11

readonly int x; объявляет поле ввода только для класса. Это поле может быть назначено только в конструкторе, и его значение не может измениться на время жизни класса.

int x { get; } объявляет автоматически выполненное свойство readonly и в этой форме недействительно (потому что у вас не было бы никакого способа установить значение). Нормальное свойство readonly не гарантирует возврата одного и того же значения каждый раз, когда он вызывается. Значение может меняться в течение всего жизненного цикла класса. Например:

public int RandomNumber 
{ 
    get { return new Random().Next(100); } 
} 

Это будет возвращать другое число каждый раз, когда вы его вызываете. (Да, это ужасное злоупотребление свойствами).

-1

Буквально нет большой разницы, потому что вы объявили x частным (по умолчанию). Вы всегда можете перекомпилировать свой класс, чтобы сделать x другим.

Однако, если бы это было публично, определение public int x { get; } позволяет впоследствии расширить определение к чему-то вроде этого:

int x { get { 
    return DoSomeOperation(); 
    } 
} 

Вы можете сделать это, не нарушая своих клиентов. Реализация getter является частной, и клиенты называют ее, не зная, является ли она статическим значением или имеет операцию внутри своего аксессуара get.

+0

OP - это различие между' readonly' и свойством только с помощью getter. –

4

Нет, заявления не означают одно и то же. Полная версия свойства будет иметь переменную подкладочный:

private int _x; 

public int X 
{ 
    get { return _x; } 
} 

Другой метод в классе может изменить переменную подкладочный, изменив значение свойства:

private void SomeMethod(int someValue) 
{ 
    _x = someValue * 5; 
} 

readonly ключевое слово позволяет только переменная-член будет назначен в его заявлении или в конструкторе:

// Both of these compile 

private readonly int _x = 1; 

public SomeClass() 
{ 
    _x = 5; 
} 

// This will not compile 

private void SomeMethod(int someValue) 
{ 
    _x = someValue * 5; 
} 

Так get -только свойство, поддерживая переменная отмеченный readonly является истинным только для чтения.