Имеют ли эти утверждения одно и то же?
Есть ли разница между readonly и {get; }
int x { get; }
readonly int x;
Имеют ли эти утверждения одно и то же?
Есть ли разница между readonly и {get; }
int x { get; }
readonly int x;
В ответ на ваш вопрос: Там есть разница между чтением и {получить; }:
В int x { get; }
(который не будет компилироваться, так как не существует способа установить й - Я думаю, что вам нужно public int x { get; private set; }
) код может сохранить изменения X
В readonly int x;
х инициализируются либо в конструкторе или инлайн а затем никогда не может измениться.
с readonly x может быть задано только в конструкторе или в строке , –
Возможно, вы хотите уточнить, что его «Нет» означает «Эти утверждения означают одно и то же», но «Да»: «Есть ли разница между readonly и {get; }». Возможно, название или встроенный текст следует изменить, чтобы сделать его немного менее запутанным. – SwDevMan81
'readonly' его важно понять, что его можно инициализировать только в конструкторе. –
readonly int x;
объявляет поле ввода только для класса. Это поле может быть назначено только в конструкторе, и его значение не может измениться на время жизни класса.
int x { get; }
объявляет автоматически выполненное свойство readonly и в этой форме недействительно (потому что у вас не было бы никакого способа установить значение). Нормальное свойство readonly не гарантирует возврата одного и того же значения каждый раз, когда он вызывается. Значение может меняться в течение всего жизненного цикла класса. Например:
public int RandomNumber
{
get { return new Random().Next(100); }
}
Это будет возвращать другое число каждый раз, когда вы его вызываете. (Да, это ужасное злоупотребление свойствами).
Буквально нет большой разницы, потому что вы объявили x
частным (по умолчанию). Вы всегда можете перекомпилировать свой класс, чтобы сделать x другим.
Однако, если бы это было публично, определение public int x { get; }
позволяет впоследствии расширить определение к чему-то вроде этого:
int x { get {
return DoSomeOperation();
}
}
Вы можете сделать это, не нарушая своих клиентов. Реализация getter является частной, и клиенты называют ее, не зная, является ли она статическим значением или имеет операцию внутри своего аксессуара get
.
OP - это различие между' readonly' и свойством только с помощью getter. –
Нет, заявления не означают одно и то же. Полная версия свойства будет иметь переменную подкладочный:
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
является истинным только для чтения.
Вам не нужно писать «int x {get; private set;}»? – jgauffin
@jgauffin: Нет, если код находится в интерфейсе. –
Я уверен, что вы не можете буквально иметь 'int x {get; } '(как свойство auto), так как нет способа установить его или сделать что-либо вообще. Это должно быть 'int m_x; int x {get {return m_x; }} '. –