首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity和Dispose模式实现中的递归

Unity和Dispose模式实现中的递归
EN

Stack Overflow用户
提问于 2010-06-03 00:11:41
回答 2查看 1.8K关注 0票数 2

我的类继承自UnityContainer (来自Unity2.0),以下是源代码:

代码语言:javascript
复制
    public class UnityManager : UnityContainer
    {

        private UnityManager()
        {
            _context = new MyDataClassesDataContext();
            // ...
        }


        protected override void Dispose(bool disposing)
        {
            if ( disposing )
            {
                _context.Dispose();
            }

            base.Dispose(disposing);
        }

        private readonly CMCoreDataClassesDataContext _context;
    }

当为UnityManager类的实例调用Dispose方法时,它会陷入递归...为什么?据我所知,base.Dispose应该只调用基类的Dispose方法...难到不是么?谁回调了UnityManager的处置(Bool)?如何防止这种情况发生?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-03 05:54:11

多亏了妮可我找到了一个理由。谢谢。但是在这种情况下如何处理容器呢?如果调用' Dispose‘,例如UnityManager,base.Dispose(True)将再次调用Dispose...再一次(递归将开始)。

为了解决这个问题,我添加了额外的私有变量bool _bDisposed:

代码语言:javascript
复制
    protected override void Dispose(bool disposing)
    {
        if (_bDisposed)
            return;

        if ( disposing )
        {
            _context.Dispose();
        }
        _bDisposed = true;

        base.Dispose(disposing);
    }

    private bool _bDisposed;

这是Bill Wagner在"Effective C#“中建议的"Dispose”模式实现(如果我没有错的话)

票数 2
EN

Stack Overflow用户

发布于 2010-06-03 01:05:23

您是否在容器中注册了UnityManager实例?如果是这样,当容器被释放时,它将被容器释放。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2959485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档