多次调用C#二进制树节点设置程序



你好,我不知道为什么在我的实现中会多次调用setter,或者我如何防止这种情况发生?

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();
}
}

为什么在setter本身中再次调用setter?我可以通过编写一个设置Node的方法来防止这个问题,但我想知道C#getters setters是如何做到的。。。

顺便说一句,得到的exeption是StackOverflow

您得到堆栈溢出是因为这里有无限递归。我会解释的原因

在该行中,节点a=新节点(1(;调用构造函数,即此行的_value=value;在这一行中,您调用公共Node_left方法,在该方法的实现中,您通过以下代码执行递归调用(从方法调用到itslef(_left=值;

解决方案是:

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();
}
}

最新更新