Re[3]: C# [Proposal] init block for safe initialization of complex
От: sergii.p  
Дата: 25.12.25 10:41
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Потому, что про нелокальные функции у компилятора нет информации.


то есть вызвать нелокальные функции в обработке property.set он может, а в init блоке он их уже не видит? Или может я не понял, что имеется в виду под локальными функциями? Локальные в модуле, классе, функции?

S>Попробуйте переписать пример с использованием Optional. Станет хуже


переписал. Не вижу, что стало хуже

using System;
using System.Collections.Generic;
using Optional;

public class Node<T>
{
    public required T Value { get; set; }
    public Option<Node<T>> Next { get; set; }
    public Option<Node<T>> Previous { get; set; }

    public Node(T value)
    {
        Value = value;
        Next = Option.None<Node<T>>();
        Previous = Option.None<Node<T>>();
    }

    public static Option<Node<T>> Init<T>(IEnumerable<T> values)
    {
        using var enumerator = values.GetEnumerator();
        if (!enumerator.MoveNext())
            return Option.None<Node<T>>();

        var head = new Node<T>(enumerator.Current);
        var current = head;

        while (enumerator.MoveNext())
        {
            var newNode = new Node<T>(enumerator.Current);

            current.Next = Option.Some(newNode);
            newNode.Previous = Option.Some(current);

            current = newNode;
        }

        return Option.Some(head);
    }

    public static IEnumerable<T> TraverseForward<T>(Option<Node<T>> start)
    {
        var current = start;

        while (current.Match(
            some: node =>
            {
                yield return node.Value;
                current = node.Next;
                return true;
            },
            none: () => false
        )) { }
    }
}


S>Что именно непонятно или вызывает сомнения?


ну вот привёл код выше. Чем секция init будет лучше? Позволит писать компактнее — спорно. Безопаснее — да нисколько. В общем motivation должен быть в виде сравнения. Вот у меня был такой workaround, а вот так получается с init блоком. Второй вариант очевидно лучше по следующим причинам ... Сейчас лично мне совсем не очевидно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.