我遇到了这个错误
进程由于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
方法不是递归方法。
答案 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));