Как можно инициализировать обязательные поля (required) в C# с помощью конструктора?

Я разрабатываю приложение и захотел использовать обязательные поля (required) в DataGrid для установки полей, которые должны быть заполнены. Я решил повторить пример кода из документации к Avalonia UI, применяя обязательные поля. Однако, при такой реализации я получаю ошибку: "Required member 'Person.User' must be set in the object initializer or attribute constructor". 

В то же время, при следующей инициализации ошибки не возникает:

```csharp
new Person()
{
    User = "John Smith",
    RatingOfUser = "Excellent",
    Date = DateTime.Today.Date
}
```

Тем не менее, этот способ инициализации кажется слишком громоздким. Можно ли упростить его?
  • 29 августа 2024 г. 14:14
Ответы на вопрос 2
В C# 9.0 и выше вы можете использовать требуемые поля (`required`) в сочетании с конструкторами для упрощения инициализации объектов. Вы можете сделать так, чтобы обязательные поля были инициализированы через конструктор, что позволит избежать использования инициализаторов объектов. Вот пример, как это можно сделать:

```csharp
public class Person
{
    public required string User { get; init; }
    public string RatingOfUser { get; init; }
    public DateTime Date { get; init; }

    // Конструктор, где можно установить обязательные поля
    public Person(string user, string ratingOfUser, DateTime date)
    {
        User = user;
        RatingOfUser = ratingOfUser;
        Date = date;
    }
}
```

Теперь вы можете инициализировать объект `Person` таким образом:

```csharp
var person = new Person("John Smith", "Excellent", DateTime.Today);
```

Таким образом, вы используете конструктор для обязательного поля `User` и устанавливаете остальные поля через параметры. Это делает код более читаемым и кратким, так как все обязательные поля задаются в одном месте – в конструкторе.

Если вы хотите оставить возможность инициализировать объект также с помощью инициализатора, но хотите минимизировать количество публичных полей, вы можете использовать инициализаторы для необязательных свойств, а обязательные поля оставлять только в конструкторе. Например:

```csharp
public class Person
{
    public required string User { get; }
    public string RatingOfUser { get; init; }
    public DateTime Date { get; init; }

    public Person(string user)
    {
        User = user;
    }
}
```

Теперь вы можете использовать конструкцию:

```csharp
var person = new Person("John Smith")
{
    RatingOfUser = "Excellent",
    Date = DateTime.Today
};
```

Таким образом, вы сможете легко инициализировать как обязательные, так и необязательные свойства.
Добавь атрибут SetsRequiredMembers для конструктора
Похожие вопросы