堆栈溢出异常C#

时间:2020-07-25 05:39:49

标签: c# recursion math stack-overflow getter

我遇到了这个错误

进程由于StackOverflowException而终止。

错误源来自此代码

const express=require('express');
const mongoose=require('mongoose');
const Order=mongoose.model('Order');

我搜索了错误,并指出由于 internal class Record { [Name("Name")] public string Name { get; set; } [Name("Principal")] public int Principal { get { return Math.Abs(Principal); } set {; } } } 导致了错误的发生。我认为我的recursive方法不是递归方法。

2 个答案:

答案 0 :(得分:4)

也许您想考虑其中之一:

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

}

任何返回获得自己的值而没有停止的结果的属性或方法,将导致堆栈溢出。正常工作的递归事物通常具有某些条件,该条件最终会改变状态并停止递归(不会返回获得自己的值的结果)

看看第一个:我们不使属性math.abs本身,我们使它不吸收其他东西-这不能递归,除非其他东西要返回第一个东西(然后递归会失败他们之间)

第二个可能更像是您要执行的操作-再次吸收一些其他内容(一个后备变量),而不是该属性本身防止递归溢出。在这个我吸收集合的原因是,因为您似乎不想检索本金的非吸收值,所以我们最好在存储它时吸收它,然后我们就可以检索它一百万次而每次都不吸收。如果您需要私有访问非Abs'd变量,则应按get方式进行abs。或者,如果您知道用例是将其存储一百万次并仅获取一次,则再次执行abs获得而不是集合。在大多数情况下,我期望的典型程序行为是设置的次数少于获得的次数,因此我们可以通过谨慎选择何时进行Abs来避免不必要的工作

答案 1 :(得分:-1)

正如Steve所建议的那样,您可以在Principal中获取Principal属性。因此是递归的。

您是要返回Math.Abs​​(typeof(Principal));