Есть ли разница между readonly и {get;}
означают ли эти утверждения одно и то же?
int x { get; }
readonly int x;
4 ответов
В ответ на ваш вопрос: есть is разница между readonly и {get;}:
на int x { get; }
(который не будет компилироваться, поскольку нет способа установить x-я думаю, что вам нужно public int x { get; private set; }
) ваш код может продолжать изменять x
на readonly int x;
, x инициализируется либо в конструкторе, либо в inline, а затем никогда не может измениться.
readonly int x;
объявляет поле readonly для класса. Это поле может быть назначено только в конструкторе, и его значение не может изменяться в течение всего времени существования класса.
int x { get; }
объявляет автоматически реализованное свойство readonly и в этой форме недопустимо (потому что у вас не было бы никакого способа установить значение). Обычное свойство readonly не гарантирует возврата одного и того же значения при каждом вызове. Значение может изменяться в течение всего времени существования класса. Для пример:
public int RandomNumber
{
get { return new Random().Next(100); }
}
Это будет возвращать другой номер каждый раз, когда вы его вызываете. (Да, это ужасное злоупотребление собственностью).
нет, заявления не означают одно и то же. Полная версия свойства будет иметь переменную backing:
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
- Это верно только для чтения свойство.
буквально, нет большой разницы, потому что вы объявили x
быть приватным (по умолчанию). Вы всегда можете повторно скомпилировать свой класс X разные.
однако, если бы это было публично, определение public int x { get; }
позволяет позже развернуть определение примерно так:
int x { get {
return DoSomeOperation();
}
}
вы можете сделать это, не ломая своих клиентов. Реализация геттера является частной, и клиенты называют ее, не зная, является ли она статическим значением или имеет операция внутри его get
- аксессоры.