c# - 为什么要实现 IDisposable 以仅清理非托管资源?

标签 c# .net

documentation

You should implement IDisposable only if your type uses unmanaged resources directly.

我主要是 Java 背景,这对我来说听起来很奇怪。假设我有一个包含 IDisposable 成员的类:

class Foo : IDisposable {
    private StreamWriter sw;
    ...
}

... 并且假设这个类被用作,例如,作为一种过滤器,它接受字符串并修改它们,然后使用 StreamWriter sw 输出它们.我想像使用 Writer 一样使用这个类。

为什么我不想实现 Dispose(bool)这将调用 sr.Dispose()?如果我用 Java 编写代码(Java Closable 接口(interface)类似于 .NET 的 IDisposable ,尽管在某些方面有所不同),这就是我必须要做的事情。然而文档说我不应该这样做,因为我没有直接使用非托管资源。

如果我不覆盖 Dispose(bool) ,托管资源如何sw当我离开由 using 启动的 block 时被处置声明?

最佳答案

当您的类包含 IDisposable 字段(例如 StreamWriter)时,您应该实现 IDisposable

在这种情况下,您可以假设您的类型在幕后确实使用了非托管资源(通过 StreamWriter 类),并且您应该始终处置任何实现了 IDisposable 的对象> 在您使用完它们后立即界面。

Why wouldn't I want to implement IDisposable(bool) which would call sr.Dispose()?

你当然会。

If I don't override Dispose(bool), how does the managed resource sw get disposed when I leave the block started by the using statement?

事实并非如此。底层非托管资源最终可能会被终结器释放(取决于 IDisposable 类的实现),但托管对象不会被释放,除非您在您的类中显式释放它。

关于c# - 为什么要实现 IDisposable 以仅清理非托管资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48869997/

相关文章:

.net - 字符串的 C++ 含义^

c# - 显示 DataTable 的值

c# - 如何在 .NET 中将提示/标记写入 WAV 文件

c# - 使用 EventSourcing 在 CQRS 中使用 EntityId 复制整个实体

c# - 是否有 Microsoft.Office.Interop.Excel 的替代库?

c# - C# 中的 BadImageFormatException

c# - File.GetLastWriteTime 似乎返回 'out of date' 值

c# - ExecuteReader 上的 Mysql 异常

c# - ServiceStack API 和 ASP MVC Authentication 两种方式

c# - 在 UserControl 中居中标签