Ответы:
Да, оба они доступны только для чтения, но есть разница. В первом есть вспомогательное поле, которое инициализируется 0, прежде чем конструктор будет выполнен. Вы можете изменить значение только в конструкторе , как обычное поле только для чтения. Сам геттер просто возвращает значение поля.
Во втором случае геттер просто возвращает 0 каждый раз, без поля.
Поэтому, чтобы вообще не использовать какие-либо автоматически реализованные свойства или члены с выражениями, мы имеем:
Первая версия
private readonly int _number = 0;
public int Number { get { return _number; } }
Вторая версия
public int Number { get { return 0; } }
Более ясный пример разницы можно увидеть так:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Если вы создаете один объект, его CreationTime
свойство всегда будет давать один и тот же результат - потому что он хранится в поле только для чтения, инициализированном при построении объекта. Однако каждый раз, когда вы получаете доступ к CurrentTime
свойству, это будет вызывать DateTime.UtcNow
оценку, поэтому вы получите потенциально другой результат.
Разница лишь в том, когда это 0
оценивается: при создании объекта или при использовании свойства.
Вы можете увидеть это лучше с помощью свойств DateTime:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
Start
Свойство постоянно возвращается в то же время (в момент создания экземпляра), в то время как Now
изменения , чтобы отразить текущее время.
Пояснение :
Первая версия («Пуск») предоставляет начальное значение, которое может даже быть перезаписано конструктором. Так что это оценивается только один раз.
Вторая версия («Сейчас») предоставляет выражение, которое будет «получателем» этого свойства. Так что это оценивается каждый раз, когда свойство читается. Нет даже вспомогательного поля, которое конструктор может перезаписать.
Это особенности языка C # 6.
Первый пример
public int Number { get; } = 0
Первый пример - авто-свойство только для получателя . Вспомогательное поле авто-свойства только для получателя неявно объявляется как доступное только для чтения.
Второй пример
public int Number => 0;
И второй пример - тела выражений для членов функций, подобных свойствам . Обратите внимание, что здесь нет никакого get
ключевого слова: оно подразумевается использованием синтаксиса тела выражения.
Оба доступны только для чтения.
random.NextInt()
. Первая версия оценит это один раз и всегда будет иметь одинаковое значение. Второй будет возвращать новое значение каждый раз.