堆栈溢出异常 C#
Stack Overflow Exception C#
我遇到过这个错误
Process is terminated due to WhosebugException.
错误源来自这段代码
internal class Record
{
[Name("Name")]
public string Name { get; set; }
[Name("Principal")]
public int Principal { get { return Math.Abs(Principal); } set {; } }
}
我搜索了错误,它指出错误的发生是因为 recursive
。我认为我的 Principal
方法不是递归方法。
也许您想考虑其中之一:
internal class Record
{
[Name("Name")]
public string Name { get; set; }
[Name("Principal")]
public int Principal { get; set; }
[Name("AbsPrincipal")]
public int AbsPrincipal { get { return Math.Abs(Principal); } set; }
}
internal class Record
{
[Name("Name")]
public string Name { get; set; }
[Name("Principal")]
private int _principal = 0;
public int Principal {
get => _principal;
set => _principal = Math.Abs(value);
}
}
任何 属性 或方法 return 获取自己的值而没有任何停止的结果都会溢出堆栈。正确工作的递归事物通常具有最终改变状态并停止递归的条件(不是 return 获得自己的值的结果)
看看第一个:我们不让 属性 math.abs 本身,我们让它成为其他东西 - 这不能递归,除非其他东西是 return 第一件事(然后递归会在它们之间翻转)
第二个可能更像你想做的 - 我们再次使用其他东西(支持变量)而不是 属性 本身来防止递归溢出。在这一个中,我在集合中使用了 abs,因为您似乎从来不想检索本金的非 Abs 值,因此我们不妨在存储它时将其 abs,然后我们每次都可以在没有 abs 的情况下检索它一百万次.. 当然如果你需要对非 Abs 变量的私有访问,你应该在获取时做 abs .. 或者如果你知道你的用例将它存储一百万次并且只获取一次,再次做 abs获取而不是设置。在大多数情况下,我期望的典型程序行为是设置次数少于获取次数,因此我们可以通过仔细选择何时执行 abs
来避免不必要的工作
正如 Steve 所建议的,您可以在获取 Principal 时调用 Principal 属性。因此递归。
你是想 return Math.Abs(typeof(Principal));
我遇到过这个错误
Process is terminated due to WhosebugException.
错误源来自这段代码
internal class Record
{
[Name("Name")]
public string Name { get; set; }
[Name("Principal")]
public int Principal { get { return Math.Abs(Principal); } set {; } }
}
我搜索了错误,它指出错误的发生是因为 recursive
。我认为我的 Principal
方法不是递归方法。
也许您想考虑其中之一:
internal class Record
{
[Name("Name")]
public string Name { get; set; }
[Name("Principal")]
public int Principal { get; set; }
[Name("AbsPrincipal")]
public int AbsPrincipal { get { return Math.Abs(Principal); } set; }
}
internal class Record
{
[Name("Name")]
public string Name { get; set; }
[Name("Principal")]
private int _principal = 0;
public int Principal {
get => _principal;
set => _principal = Math.Abs(value);
}
}
任何 属性 或方法 return 获取自己的值而没有任何停止的结果都会溢出堆栈。正确工作的递归事物通常具有最终改变状态并停止递归的条件(不是 return 获得自己的值的结果)
看看第一个:我们不让 属性 math.abs 本身,我们让它成为其他东西 - 这不能递归,除非其他东西是 return 第一件事(然后递归会在它们之间翻转)
第二个可能更像你想做的 - 我们再次使用其他东西(支持变量)而不是 属性 本身来防止递归溢出。在这一个中,我在集合中使用了 abs,因为您似乎从来不想检索本金的非 Abs 值,因此我们不妨在存储它时将其 abs,然后我们每次都可以在没有 abs 的情况下检索它一百万次.. 当然如果你需要对非 Abs 变量的私有访问,你应该在获取时做 abs .. 或者如果你知道你的用例将它存储一百万次并且只获取一次,再次做 abs获取而不是设置。在大多数情况下,我期望的典型程序行为是设置次数少于获取次数,因此我们可以通过仔细选择何时执行 abs
来避免不必要的工作正如 Steve 所建议的,您可以在获取 Principal 时调用 Principal 属性。因此递归。
你是想 return Math.Abs(typeof(Principal));