Я активировал эту функцию в проекте с классами объекта передачи данных (DTO), как показано ниже:
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
Но я получаю ошибку:
CS8618
: Необнуляемое свойство 'ServiceUrl' неинициализировано. Подумайте об объявлении свойства обнуляемым.
Это класс DTO, поэтому я не инициализирую свойства. Это будет обязанностью кода, инициализирующего класс, чтобы гарантировать, что свойства не равны NULL.
Например, звонящий может сделать:
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
Мой вопрос: как обрабатывать такие ошибки в классах DTO, когда включен контекст обнуляемости C # 8?
Plain Old C# Object
. Просто объект, как и любой другой, без наследования от какого-либо специального класса. Я подозреваю, что у вас другой вопрос. Как создать DTO -Data Transfer Objects
This should be the responsibility of the one initializing the class to ensure that the properties are non-null
класс всегда должен быть в допустимом состоянии. Еслиnull
это не разрешено, свойство никогда не должно быть нулевым. Возможно, вместо базовой строки вы должны использовать специализированный класс для URL, который может иметь значениеNone
или «отсутствует», как класс Option в F #. C # 8 позволяет вам писать такие классы и проверять их с помощью сопоставления с образцомpublic string ServiceUrl { get; set; } = default! ;
. Я надеюсь, что в будущем у Roslyn появится способ справиться с поздней инициализацией за пределами ctor. Я использовал MayBe <T> (как класс Option), но я переключился на обнуляемый ссылочный тип в c # 8 для нового кода.Ответы:
Следующее решение рекомендовано EF Core & EF6, см.
1) Путем инициализации
null!
с прощающим оператором2) Использование вспомогательного поля:
источник
!
оператора.Если он не обнуляемый, то что может сделать компилятор, когда объект инициализирован?
Значение по умолчанию для строки равно нулю, поэтому вы будете
либо нужно назначить строковое значение по умолчанию в объявлении
public string ServiceUrl { get; set; } = String.Empty;
Или инициализируйте значение в конструкторе по умолчанию, чтобы избавиться от предупреждения
Используйте
!
оператор (который вы не можете использовать)Сделайте это обнуляемым, как упомянуто.
источник
ServiceUrl'
не может быть = String.Empty. Есть другие свойства сложного типа, которые не могут быть нулевыми, поэтому я использовалdefault
: 'public MyClass MyProperty {get; набор; } = по умолчанию! чтобы остановить предупреждение. Этот класс (и другие) является конструктором без параметров и в последнее время инициализируется вне области действия ctor.Еще одна вещь, которая может пригодиться в некоторых сценариях:
Может использоваться поверх элемента или целого типа.
Еще одна вещь, которую следует учитывать, - добавление
#nullable disable
в начало файла, чтобы отключить нулевую ссылку для всего файла.источник