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; }
}
554   3  

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

    Ничего не найдено.