避免堆栈溢出异常

时间:2013-03-26 13:03:22

标签: c# asp.net linq-to-entities stack-overflow infinite-loop

我在这部分代码中遇到了堆栈溢出异常,显然是因为Customer对象调用了CustomerBackgroundLevel对象列表,每个对象都创建一个新的customer对象。我正试图找到解决问题的方法,任何帮助都将受到赞赏..

客户构造函数 -

public CustomerVO(Customer item)
    {
        CustomerID = item.CustomerID;
        CustomerName = item.CustomerName;
        ECNNumber = item.ECNNumber;

        CustomerBackgroundLevels = item.CustomerBackgroundLevels.Select(c => new CustomerBackgroundLevelVO(c)).ToList();
    }

客户背景级别构造函数 -

        public CustomerBackgroundLevelVO(CustomerBackgroundLevel item)
    {
        CustomerBackgroundLevelID = item.CustomerBackgroundLevelID;
        CustomerID = item.CustomerID;
        BackgroundLevelID = item.BackgroundLevelID;
        StartDate = item.StartDate;
        EndDate = item.EndDate;
        Customer = new CustomerVO(item.Customer);
        BackgroundLevel = new BackgroundLevelVO(item.BackgroundLevel);
    }

客户获取方法 -

        public CustomerVO GetByID(int id)
    {
        var item = repository.AsQueryable().Where(x => x.CustomerID == id).FirstOrDefault();
        if (item == null)
            return null;

        return new CustomerVO(item);
    }

3 个答案:

答案 0 :(得分:2)

是的,正如你所说的那样在一个循环中创建新对象会导致没有任何好处。

不是在构造函数中创建所有这些包装器对象,为什么不根据需要包装它们?也就是说,当您执行一些需要CustomerVO对象的代码时,在该函数中创建CustomerVO对象,然后在函数结束时让它超出范围。

答案 1 :(得分:1)

你可以像这样解决你的循环:

public CustomerVO(Customer item)
{
    CustomerID = item.CustomerID;
    CustomerName = item.CustomerName;
    ECNNumber = item.ECNNumber;

    **CustomerBackgroundLevels = item.CustomerBackgroundLevels.Select(c => new CustomerBackgroundLevelVO(c,this)).ToList();
}

**public CustomerBackgroundLevelVO(CustomerBackgroundLevel item, CustomerVO vocustomer)
{
    CustomerBackgroundLevelID = item.CustomerBackgroundLevelID;
    CustomerID = item.CustomerID;
    BackgroundLevelID = item.BackgroundLevelID;
    StartDate = item.StartDate;
    EndDate = item.EndDate;
    **Customer = vocustomer;
    BackgroundLevel = new BackgroundLevelVO(item.BackgroundLevel);
}

答案 2 :(得分:0)

这是一个复制构造函数吗?如果是这样,您需要创建一个自定义构造函数来复制项目,而不是在新建对象并复制它的两种情况下使用它。

return new CustomerVO(item);

以上是不必要的,问题在于:

Customer = new CustomerVO(item.Customer);

将以上行更改为:

Customer = item.Customer;

除非你有参考问题,否则你需要设计一个新的构造函数。

如果item.Customer对象不是CustomerVO对象,那么您需要将当前CustomerVO对象的引用传递给CustomerBackgroundLevelVO的构造函数。