C# 处理对象是否会处理所有IDisposable属性?

C# 处理对象是否会处理所有IDisposable属性?,c#,garbage-collection,dispose,idisposable,C#,Garbage Collection,Dispose,Idisposable,这是一个一般性的问题,虽然我有一个具体的例子,我在看,所以我试图保持标题和标签尽可能通用 我正在和国际奥委会做一个MVC项目。我的具体存储库实现了IDisposable来处理Ef上下文 显然,MVC处理被调用的控制器对象的处理。但是,我是否需要覆盖控制器中的Dispose()?以下是我目前的代码: private IUserRepository repository; public UserController(IUserRepository repository) { this.re

这是一个一般性的问题,虽然我有一个具体的例子,我在看,所以我试图保持标题和标签尽可能通用

我正在和国际奥委会做一个MVC项目。我的具体存储库实现了
IDisposable
来处理Ef上下文

显然,MVC处理被调用的控制器对象的处理。但是,我是否需要覆盖控制器中的
Dispose()
?以下是我目前的代码:

private IUserRepository repository;

public UserController(IUserRepository repository) {
    this.repository = repository;
}

protected override void Dispose(bool disposing) {
    if (repository is IDisposable && repository != null) {
        (repository as IDisposable).Dispose();
        repository = null;
    }

    base.Dispose(disposing);
}
我检查以确保它实现了
IDisposable
,因为我的单元测试中的模拟我认为没有实现它


现在,我的问题是,
Dispose()
的覆盖是冗余的吗?当控制器(或任何其他对象)被释放时,垃圾收集器是否也会查找实现
IDisposable
的任何属性,或者我是否正确地执行了此操作?

垃圾收集器从未自动调用Dispose,甚至垃圾收集器也不会调用它。如果对象A控制对象B的生命周期,并且对象B是一次性的,那么对象A也应该是一次性的,并且应该手动调用对象B的Dispose方法。

处置对象不会自动处置其所有属于
IDisposables的属性。它所做的只是执行
Dispose
方法,然后对象所做的事情由开发人员决定

当类的对象被释放时,它应该释放实现
IDisposable
接口的所有拥有的资源。在您的情况下,您处理的对象很可能仍在使用中


我认为Stephen Cleary的文章解释了如何处理对象以及在某些情况下可能出现的困难和问题。

不,这不是多余的。您的工作是在任何具有一次性成员的类上实现IDisposable

你的支票可能是多余的。您应该将模拟配置为允许调用存储库对象上的Dispose方法,即使您将其实现为模拟的“不做任何事情”方法

你应该看看


它解释了如何以及何时实现IDisposable,以及析构函数和Dispose方法应该如何链接。

Dispose只是一个方法调用-它与垃圾收集器无关,没有任何事情不是由Dispose方法显式实现的。这就是我的想法。在过去的几天里,我的大脑一直在思考其他问题,我不确定这种优化是否存在。我做了一个搜索,但找不到答案,所以我也想为其他可能也在寻找的新手找到答案。