Подтвердить что ты не робот

Есть ли разница между readonly и {get; }

Имеют ли эти утверждения одно и то же?

int x { get; }
readonly int x;
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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 -only, чья опорная переменная отмечена readonly, является истинным свойством только для чтения.

Ответ 4

Другие ответы устарели...

В новых версиях С# вы можете назначить значение по умолчанию для int x { get; } = 33;, что изменит ситуацию.

По сути, он компилируется в свойство "только для получения" с частным резервным полем readonly. (Подробнее см. https://softwareengineering.stackexchange.com/q/372462/81745)

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

Ответ 5

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

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

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

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