【问题标题】:how to solve System.StackOverflowException?如何解决 System.StackOverflowException?
【发布时间】:2021-04-24 08:06:54
【问题描述】:

你好社区我有一个product class 有一个名为public_price 的属性,我在get 集中应用了函数,但是当比较detailcombo 对象是否不同于null 时,它会抛出System.StackOverflowException 错误,为什么会发生这种情况,我该如何解决?

这是我的班级产品:

 public class Producto
    {
        [Key]
        public Guid ProductoId { get; set; }
        public Guid InquilinoId { get; set; }
        private string Nombre { get; set; }

        public virtual List<DetalleCombo> DetalleCombo { get; set; } 

        private decimal _PrecioPublico;
        public decimal Precio_Publico
        {
            get
            {               
                decimal total = 0;
                if (DetalleCombo != null)
                {
                    foreach (var item in DetalleCombo)
                    {
                        total += item.Precio * item.Cantidad;
                    }

                    return total;
                }
                else if (DetalleGenerico != null)
                {
                    if (Usar_PrecioGenerico == true)
                    {
                        return _PrecioPublico;
                    }
                    else
                    {
                        foreach (var item in DetalleGenerico)
                        {
                            if (item.Es_Seleccionado == true)
                            {
                                return item.Producto.Precio_Publico;
                            }
                        }
                        return 0;
                    }
                }
                else
                {
                    return _PrecioPublico;
                }
            }
            set { _PrecioPublico = value; }
        }
}

这是我的班级 DetelleCombo:

 public class DetalleCombo
    {
        public Guid DetalleComboId { get; set; }
        public virtual Producto Producto { get; set; }
        public decimal Cantidad { get; set; }
        public decimal Precio { get; set; }        
    }

这是我的班级 DetlleGenerico:

public class DetalleGenerico
    {
        public Guid DetalleGenericoId { get; set; }
        public virtual Producto Producto { get; set; }
        public bool Es_Seleccionado { get; set; }       
    }

错误:

【问题讨论】:

  • 提示:在return item.Producto.Precio_Publico;这一行设置断点并学习调试器的使用方法
  • 在你的setter和getter中放一个断点,当调试器中断时,一步一步进入,看看为什么getter或setter会调用自己。堆栈溢出意味着函数、属性或方法无限次调用自身。
  • 强烈建议 - 将大部分代码放入您的 get 部分引用的私有方法中。更强烈的建议 - 在该部分代码周围放置一个 try catch,否则您将面临不必要的致命崩溃的风险。总是尝试 catch,尤其是在 get/set 方法中

标签: c# asp.net-core asp.net-web-api blazor stack-overflow


【解决方案1】:

在这段代码中:

foreach (var item in DetalleGenerico)
{
    if (item.Es_Seleccionado == true)
    {
        return item.Producto.Precio_Publico;
    }
}
return 0;

代码行

return item.Producto.Precio_Publico;

导致Precio_Publico 属性被无休止地调用。你不断地在这个foreach循环中结束。

每次以这种方式调用Precio_Publico,都会向堆栈添加一个堆栈帧,直到堆栈空间不足,导致堆栈溢出。

【讨论】:

  • 眼光不错(尽管寻找对属性的递归访问是解决许多 .NET 堆栈溢出的第一步)。您需要将该行更改为return item.Producto._PrecioPublico。通常,大多数 .NET 代码会将该支持字段命名为 _precioPublico 或仅命名为 precioPublico。如果您建立一个明确的命名约定,其中字段和属性看起来非常不同,那么这不太可能。
  • 在 blazor webassembly 中使用延迟加载是导致此错误的原因
  • 在启动中删除这一行 .UseLazyLoadingProxies());在我与数据库的连接中
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多