Я пытаюсь c # 8.0 и хочу включить проверку нулевого ссылочного типа для всего проекта.И я надеюсь, что смогу улучшить свой дизайн кода, но не отключить эту проверку в некоторой области кода.
Я столкнулся с проблемой при десериализации графа объектов.Объект имеет ссылку друг на друга, но для конечного пользовательского представления, всего графа объекта, все ссылки должны иметь значение.
Таким образом, во время десериализации ссылка может быть нулевой, но после загрузки всего объекта, ссылка на процесс окончательного разрешения, все ссылки.
Я попробовал какой-то стиль записи, какое-то решение работает, но расширяет большой объем кода и кажется не элегантным способом.
Например, я пытаюсь сброситькод для написания парного класса для каждого типа объектов и использования их в качестве временного объекта при десериализации.Все ссылки на эти пары классов могут быть нулевыми.После завершения десериализации скопируйте все поля и преобразуйте в реальный объект.Конечно, таким образом, мне нужно написать много кода.
Или я пытаюсь поместить обнуляемое поле и свойство, не обнуляемое.Добавьте внутренний установщик для такого поля.Этот способ имеет меньше кода, но также значительно увеличивает мою кодовую базу.
Традиционно, без учета производительности, десериализация только с использованием отражения, поэтому почти нет кода загрузки.Но написать свой собственный код синтаксического анализа имеет некоторое преимущество, например, я могу вывести более полезное сообщение об ошибке, включающее несколько советов.
Но когда я ввожу пустое поле, мой код синтаксического анализа значительно увеличивается.Я хочу знать, является ли это хорошим и правильным способом сделать это?
Для примера кода я максимально упрощаю код.Последний пример кода не так уж много, но на самом деле мой класс гораздо больше, чем этот.Поэтому я хочу знать, есть ли какой-нибудь лучший стиль кода.
class Person
{
private IReadOnlyList<Person>? friends;
internal Person(string name)
{
this.Name = name;
}
public string Name { get; }
public IReadOnlyList<Person> Friends => this.friends!;
internal SetFriends(IReadOnlyList<Person> friends)
{
this.friends = friends;
}
}
class PersonForSerialize
{
public string? Name { get; set; }
public IReadOnlyList<string> Friends { get; set; }
}
IReadOnlyList<Person> LoadPeople(string path)
{
PersonForSerialize[] peopleTemp = LoadFromFile(path);
Person[] people = new Person[peopleTemp.Count];
for (int i = 0; i < peopleTemp.Count; ++i)
{
people[i] = new Person(peopleTemp[i].Name);
}
for (int i = 0; i < peopleTemp.Count; ++i)
{
Person[] friends = new Person[peopleTemp[i].Friends.Count];
for (int j = 0; j < friends.Count; ++j)
{
string friendName = peopleTemp[i].Friends[j];
friends[j] = FindPerson(people, friendName);
}
people[i].SetFriends(friends);
}
}