C # бинарный установщик узлов дерева вызывается несколько раз - PullRequest
0 голосов
/ 17 ноября 2018

Здравствуйте. Я не знаю, почему в моей реализации сеттер вызывается более одного раза или как я могу предотвратить это?

class Node<T> {
    public T _value { get; set; }
    public Node<T> _left
    {
        set
        { System.Console.WriteLine("setter called");_left = value; }
    }
    public Node<T> _right
    {
        set
        { System.Console.WriteLine("setter called"); _right = value; }
    }

    public Node(T value){
        _value = value;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Node<int> a = new Node<int>(1);
        Node<int> b = new Node<int>(3);

        a._left = b;

        System.Console.ReadKey();
    }
}

Почему сеттер снова вызывается внутри самого сеттера?Я могу предотвратить эту проблему, написав метод, который устанавливает узел, но я хотел бы знать, как это делается установщиками геттеров C # ...

Кстати, в результате получается исключение StackOverflow

1 Ответ

0 голосов
/ 17 ноября 2018

Вы получили переполнение стека, потому что у вас здесь бесконечная рекурсия.я объясню, почему

в этой строке Node a = new Node (1);Вы вызываете конструктор, т.е. строку this _value = value;в этой строке вы вызываете общедоступный метод Node _left, и при реализации этого метода вы выполняете рекурсивный вызов (вызов метода tolelef) по следующему коду: _left = value;

Решение:

public class Node<T> {
    public T Value { get; set; }

    private Node<T> _left;
    public Node<T> Left
    {
        set
        { System.Console.WriteLine("setter called");_left = value; }
    }
    private Node<T> _right;
    public Node<T> Right
    {
        set
        { System.Console.WriteLine("setter called"); _right = value; }
    }

    public Node(T value){
        Value = value;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Node<int> a = new Node<int>(1);
        Node<int> b = new Node<int>(3);

        a.Left = b;

        System.Console.ReadKey();
    }
}
...