通过构造设置 属性 时出现 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;
}
}
}
}
我有一个简单的 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;
}
}
}
}