C# 6 геттеры и сеттеры
Я использую C# 6.0 для создания геттеров и сеттеров свойств в классе, подобном этому:
private int _id { get; set; }
public int Id => _id;
Но компилятор говорит:
Свойство или индексатор 'Id' не может быть присвоен -- он доступен только для чтения
Как я могу исправить это, не создавая геттеры и сеттеры, как это:
private int _id { get; set; }
public int Id
{
get { return this._id; }
set { this._id = value; }
}
3 ответов:
Сокращенный синтаксис с => только создает свойство только для чтения.
private int _id; public int Id => _id;Это эквивалентно автоматическому свойству, которое доступно только для чтения:
public int Id { get; }Если вы хотите, чтобы ваше свойство было одновременно настраиваемым и получаемым, но только общедоступным, то определите private setter:
public int Id { get; private set; }Таким образом, вам не нужно никакое частное поле.
С
private int _id { get; set; }Вы создаете СВОЙСТВО
_idс помощью геттера и сеттера.С
public int Id => _id;Вы создаете свойство
Id, которое имеет только геттер и возвращает значение свойства_idЯ думаю, что вы путаете, как воспользоваться автоматическими свойствами, потому что это
private int _id { get; set; } public int Id { get { return this._id; } set { this._id = value; } }Создает два свойства:
_idС автоматически генерируемым геттером / сеттером иIdс явным геттером / сеттером, которые просто вызывают соответствующий геттер / сеттер из_id.Без функции автоматического свойства вы должны были написать следующее:
private int _id; public int Id { get { return this._id; } set { this._id = value; } }Здесь
_id- это поле, аId- свойство.
Это синтаксис C# 7.0, на всякий случай, если вы хотите сохранить закрытое поле:
public int Id { get => _id; set => _id = value; } private int _id;Что очень полезно для предоставления полного доступа к некоторым свойствам обернутого объекта:
private Person wrappedObject; public string Name { get => wrappedObject.Name; set => wrappedObject.Name = value; }
Comments