C# Как лучше всего РАЗРЕШИТЬ предупреждение о компиляции "CS8618"
Если мы объявим свойство следующим образом:
public class Cat
{
public string Name { get; set; }
}
мы получаем предупреждение:
CS8618 — переменная, допускающая значение NULL, должна содержать значение, отличное от NULL, при выходе из конструктора. Рассмотрите возможность объявления его как обнуляемого.
потому что свойство не инициализировано.
Представьте себе, это обязательное свойство (об этом говорят бизнес-правила). Мы можем попытаться решить ее несколькими способами:
- Объявление конструктора:
а) Непосредственно в ctor:
public class Cat
{
public Cat()
{
Name = string.Empty;
}
public string Name { get; set; }
}
б) в собственности:
public class Cat
{
public string Name { get; set; } = string.Empty;
}
на самом деле оба варианта одинаковы (синтаксический сахар).
Плюсы: мы можем использовать инициализацию класса, напримерCat cat = new ();
минусы: свойство инициализируется «фиктивным» значением при создании объекта и будет перезаписано. Или (что гораздо более важно) не будет переписан по каким-то неизвестным причинам (например, мы используем автосопоставление, и исходный объект имел пустое значение для этого поля, или мы забыли сопоставить это поле), и в результате объект будет иметь недопустимое значение (по бизнес-правилам свойство может не пусто, у кота должно быть имя)
- объявить поле как обнуляемое:
public class Cat
{
public string? Name { get; set; }
}
для меня это неверный подход (хотя здесь он описан как альтернативный), наше бизнес-правило гласит, что это обязательно, и модель не может быть допустимой без этого свойства (поэтому в лучших условиях ее даже не следует создавать)
- Использовать
ключевое слово:
public class Cat
{
public required string Name { get; set; }
}
Итак, это выглядит лучше всего (класс невозможно создать без явной инициализации
Таким образом, все эти подходы только маскируют проблему (избегайте компиляции с предупреждениями): объект может быть создан с поддельным значением (по умолчанию)!
Есть ли способ решить эту проблему?
Спасибо