Re[7]: C# [Proposal] init block for safe initialization of complex
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.12.25 11:07
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>>Sinclair не читатель.

S>Нет, это Serginio1 не читатель.

S>>Еще раз какой узел следующий для последнего узла?

S>Зависит от используемых инвариантов. Например, у "последнего" узла следующим может быть null.
S>Это позволяет, к примеру, делать простое итерирование:
S>
S>public static IEnumerable<Node> EnumerateForward(Node? list) {
S>  while (list) {
S>    yield return list;
S>    list = list.Next;
S>  }
S>}
S>

S>Это работает, если для нас такая топология является нормальной. В такой топологии никакой пользы от EmptyNode нету.


угу с null ты получишь ошибку на null
и чем (list!=null) лучше
while (!list.IsEmpty)





S>Если нет, то у нас совсем другой инвариант — за нодой должна идти валидная нода. И в ней тоже нет никакой пользы от EmptyNode.


Есть такая же польза как и у string.Empty. Позволяет работать с методами и свойствами.

S>> Empty нужны для обозначения, что этот объект дефолтный. У него можно вызвать методы, получить свойства.

S>Я вам в третий раз пишу: дефолтные объекты не помогают решить проблему, сформулированную Владом. У него проблема не в том, что у null нельзя вызывать методы или получать свойства.

У него проблема с отложенной инициализацией. Но и в его примере для последнего узла Next будет null

S>>Так же его нельзя присваивать свойствам которые должны иметь недефолтные значения и это проверяется в сеттерах или конструкторах.

S>Прекрасно. Попробуйте запретить присваивание EmptyNode в сеттерах Next и Previous. Получите нерабочий код.


S>И вообще — вы переносите проверку в рантайм, а смысл не в том, чтобы неверный код падал при исполнении. Он и так падает при исполнении.

S>И делать проверки на null в конструкторе мы умели ещё четыре версии языка назад:
S>
S>this.next = next ?? throw new ArgumentNullException(nameof(next))
S>


Ограничение может быть не только на Empty, но и по другим свойствам. И вот Empty как раз хорош.

S>>Можно помечать такие свойства атрибутами и проверять через SG

S>Это по-прежнему не решает исходную задачу.
S>> Все тоже, что и со string.Empty
S>

Исходная задача это заменить null и добавить проверку на присваивание!
Это можно сделать и добавив свои анализаторы отключив родные.
Но в итоге и это не решает проблему ибо null то остается!
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.