加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 处理所有实现IDisposable的嵌套对象

发布时间:2020-12-16 01:48:26 所属栏目:百科 来源:网络整理
导读:我的项目中有以下代码.我是否必须明确处理内部类?如果是这样的话? public class Outer : IDisposable{ Context context = new Context(); Inner inner; public Outer() { inner = new Inner(context); } public void Dispose() { context.Dispose(); }}pub
我的项目中有以下代码.我是否必须明确处理内部类?如果是这样的话?

public class Outer : IDisposable
{
    Context context = new Context();
    Inner inner;

    public Outer()
    {
        inner = new Inner(context);
    }

    public void Dispose()
    {
        context.Dispose();
    }
}

public class Inner : IDisposable
{
    Context context;

    public Inner(Context context)
    {
        this.context = context;
    }

    public void Dispose()
    {
        context.Dispose();
    }
}

Context类似于Entity Framework中的DbContext.

解决方法

那么,在这种情况下,你需要找出实际应该“拥有”上下文的内容.如果你在内心得到它,你真的需要它在外面吗?他们中哪一个真的对他们负责?它看起来像你真的想要:

public sealed class Outer : IDisposable
{
    private readonly Inner inner;

    public Outer()
    {
        inner = new Inner(new Context());
    }

    public void Dispose()
    {
        inner.Dispose();
    }
}

public sealed class Inner : IDisposable
{
    private readonly Context context;

    public Inner(Context context)
    {
        this.context = context;
    }

    public void Dispose()
    {
        context.Dispose();
    }
}

注意,已经将外部和内部密封,没有必要编写受保护的Dispose(bool处理)方法等 – 这实际上是继承,这一般会变得很痛苦.如果你真的需要将Outer和Inner子类化为需要处理更多资源的可能性,那么你需要一个更复杂的实现.

我个人尽量不尝试实现IDisposable,并且只使用using语句将一次性事物保存在局部变量中.当然,这并不总是可行,但值得尝试……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读