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

时间:2018-01-23 08:52:34

标签: c# .net stack-overflow

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

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

    }
}

谁可以向我解释为什么在通过构造函数进行类初始化之后我在setter属性上有StackOverflow异常?

2 个答案:

答案 0 :(得分:4)

您的例外来自:

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

}

答案 1 :(得分:3)

你在你的setter中设置了n,它再次调用n的setter反复做同样的事情直到你的callstack已满。

您可以尝试实现公共属性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;
            }
        }
    }
}