Мне интересно, как использовать поля класса с поздней инициализацией в C# с обнуляемыми ссылочными типами . Представьте себе следующий класс:
public class PdfCreator {
private PdfDoc doc;
public void Create(FileInfo outputFile) {
doc = new PdfWriter(outputFile);
Start();
}
public void Create(MemoryStream stream) {
doc = new PdfWriter(stream);
Start();
}
private void Start() {
Method1();
// ...
MethodN();
}
private void Method1() {
// Work with doc
}
// ...
private void MethodN() {
// Work with doc
}
}
Приведенный выше код очень упрощен. Мой реальный класс использует еще много полей, таких как doc
, а также имеет несколько конструкторов с некоторыми аргументами.
Используя приведенный выше код, я получаю предупреждение компилятора о том, что doc
не инициализирован, что правильный. Я мог бы решить эту проблему, установив тип doc
на PdfDoc?
, но тогда я должен использовать ?.
или !.
везде, где он используется, что неприятно.
Я также мог бы передать doc
как параметр для каждого метода, но помните, что у меня есть такие поля, и это нарушает принцип чистого кода в моих глазах.
Я ищу способ сообщить компилятору, что я буду инициализировать doc
перед его использованием (на самом деле я делаю это, у вызывающей стороны нет возможности получить исключение нулевой ссылки!). Я думаю, что Kotlin имеет модификатор lateinit
именно для этой цели.
Как бы вы решили эту проблему в "чистом" C# коде?