Здравствуйте, 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 то остается!