通过构造设置 属性 时出现 StackOverFlow 异常

StackOverFlow exception while setting a property via the construction

我有一个简单的 class 模型,里面只有一个 属性。

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            UF uf = new UF(5);
        }
    }
}

namespace ConsoleApp1
{
    class UF
    {
        public UF(int N)
        {
            this.n = N;
            Console.WriteLine(this.n);
        }

        private int n
        {
            get => n;

            set
            {
                if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value));
                else
                {
                    n = value;
                }
            }
        }

    }
}

谁能向我解释为什么在通过我的构造函数 class 初始化后我在 setter 属性 上遇到 Whosebug 异常?

你的异常来自这里:

n = value;

您已使用 n 的名称声明了您的 属性 并不断尝试重写其值。尝试将 属性 重命名为 N 之类的名称,应该没问题。

class UF
{
    public UF(int N)
    {
        this._n = N;
        Console.WriteLine(this.n);
    }

    int _n;
    private int N
    {
        get => _n;

        set
        {
            if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value));
            else
            {
                _n = value;
            }
        }
    }

}

您在 setter 中设置 n,它再次调用 n 的 setter 一遍又一遍地做同样的事情,直到您的调用堆栈已满。

您可以尝试实现一个 public 属性 N 和一个私有字段 n。 然后从您的属性设置字段 setter:

class Program
{
    static void Main(string[] args)
    {
        UF uf = new UF(5);

        Console.ReadKey(true);
    }
}

class UF
{
    private int n;

    public UF(int N)
    {
        this.n = N;
        Console.WriteLine(this.n);
    }

    public int N
    {
        get => n;

        set
        {
            if (value <= 0)
                throw new ArgumentOutOfRangeException(nameof(value));
            else
            {
                n = value;
            }
        }
    }
}