堆栈溢出异常 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));