【问题标题】:How to solve StackOverflowException如何解决 StackOverflowException
【发布时间】:2014-07-01 10:00:07
【问题描述】:

我尝试写这个类:

public class ModelManager
{
    public OmniacareHomeProductionEntities _db;

    public CategoriaManager categoriaManager 
    { 
        get { return categoriaManager; }
        set 
        {
            if (categoriaManager == null)
            {
            categoriaManager = new CategoriaManagerImpl();
            }
        }
    }

    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(ModelManager));
    public ModelManager()
    {
        _db = new OmniacareHomeProductionEntities();
    }
}

CategoriaManager 是一个接口,CategoriaManagerImpl 是一个实现 CategoriaManager 的类。

我在这种模式下使用 ModelManager 类:

ModelManager modelManager = new ModelManager();
modelManager.categoriaManager.saveLocalCategory(category, true);

所以当我尝试运行这段代码时,我在这一行出现了 StackOverflowError

get 
{
    return categoriaManager;
}

我的错误在哪里?你能帮帮我吗?

【问题讨论】:

  • 您正在返回属性本身,因此它陷入了无限循环。使用支持变量来获取和设置属性。
  • 对于此类工作,如果您使用 .NET 4.0 或更高版本,请使用 Lazy 或 LazyInitializer 相关 API

标签: c# interface stack-overflow


【解决方案1】:

你的问题明显在这里

  public CategoriaManager categoriaManager 
    { 
        get 
        {
            return categoriaManager;
        }
        set 
        {
            if (categoriaManager == null)
            {
                categoriaManager = new CategoriaManagerImpl(); //HERE !!!!!!!!!
            }
        }
    }

成员的名字和属性一样,改成这样,例如:

    public CategoriaManager CatManager //NAME OF HE PROPERTY ISCHANGED !!!!
    { 
        get 
        {
            return categoriaManager;
        }
        set 
        {
            if (categoriaManager == null)
            {
                categoriaManager = new CategoriaManagerImpl();
            }
        }
    }

一般准则:

  • 对于属性使用从大写开始的名称
  • 字段使用小写开头的名称

所以你的代码会像这样:

ModelManager modelManager = new ModelManager();
modelManager.CatManager.saveLocalCategory(category, true);

【讨论】:

  • 我尝试更改我的代码,但返回 categoriaManager 时出现错误; ecc ecc。错误是:当前上下文中不存在名称“categoriaManager”
  • 我已经添加了这个属性,它找到了 private CategoriaManager categoriaManager;
  • @user2405663:因为(如果按照代码执行)现在属性的名称是 CatManager。将代码更改为该名称。
【解决方案2】:

你应该这样改变它:

private CategoriaManager _categoriaManager;

public CategoriaManager CategoriaManager 
{ 
    get { return _categoriaManager; }
    set 
    {
        if (_categoriaManager == null)
        {
            _categoriaManager = new CategoriaManagerImpl();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2018-06-01
    相关资源
    最近更新 更多