У меня есть вопрос, касающийся системы ссылочных типов, допускающих обнуляемость , доступной с C# 8.
Предположим, у нас есть C# класс модели домена с изменяемым свойством ссылочного типа, как показано ниже:
public class Person
{
public string Name { get; set; }
public Person(string name)
{
Name = name;
}
}
Пока проблем нет. Но рассмотрим сценарий реального мира, я часто хочу проверять действительность свойства, так как оно является изменяемым c изменяемым свойством, и я должен убедиться, что модель инвариантна при каждом изменении свойства.
public class Person
{
private string _name;
public string Name
{
get => _name;
set => _name = value ?? throw new ArgumentNullException("Name is required.");
}
public Person(string name)
{
Name = name;
}
}
Затем компилятор генерирует предупреждение CS8618, в основном говоря:
«Поле, не имеющее значения NULL, не инициализировано. Рассмотрим объявление поля с типом NULL».
Поэтому каждый раз, когда я сталкиваюсь с предупреждением, я Я должен заключить конструктор в следующую директиву прагмы.
#pragma warning disable CS8618
public Person(string name)
{
Name = name;
}
#pragma warning restore CS8618
Но я думаю, что делать это всегда излишне и утомительно. Я что-то неправильно использую, или есть лучший способ написать такое свойство без предупреждения?
Конечно, я могу изменить тип свойства на string?
, как предполагает компилятор, но условно это не приемлемо в качестве решения, как Person всегда должен иметь ненулевое имя, и мы хотим явно указать о таком инвариантном условии в классе домена.
Другое решение, которое я рассмотрел, состоит в том, чтобы отбросить аргументы logi c и просто полагаться на предупреждение компилятора обнуляемого значения, но это не всегда возможно (Я имею в виду, что часто требуется проверка, отличная от проверки нуля.), В любом случае это просто предупреждение в обычных настройках проекта, поэтому я не думаю, что это хорошее решение.