c# - 当 IDisposable 对象未在方法中释放时,为什么没有编译器或分析器警告?

标签 c# idisposable

示例代码:

internal class Program
{
    static void Main(string[] args)
    {
        Foo foo = new Foo();
    }
}

public class Foo : IDisposable
{
    public void Dispose()
    {
        // Not invoked.
        Console.WriteLine("Foo disposed");
    }
}

这里 Foo 类型是 IDisposable,但 'foo' 变量没有包装在 'using' 语句中;要么是带有“using” block /范围的传统语法,要么是当变量超出范围时调用 Dispose() 的新语法,如下所示:

using Foo foo = new Foo();

鉴于这可能是资源泄漏的根源,为什么这种情况下没有编译器警告或分析器规则?

这似乎是一个明显需要检查的事情,因此我怀疑这种遗漏是有充分理由的。

最佳答案

编辑:删除了忽略 StreamWriterleaveOpen 构造函数参数的错误示例。经过重新思考,我还意识到,除非调用 Dispose ,否则数据将保持未刷新状态,因此 dispose 是正确的调用。

我很确定这是因为您并不总是想要Dispose对象。例如,Task 对象是IDisposable,但您通常不会显式处置它们。可能还有更多这样的类型,即很少分配非托管资源的类型,并且只有在它们的终结器减慢应用程序速度时才应处置它们。

此外,如果您的类具有无论如何都需要处置的非托管资源,那么它应该实现 Dispose Pattern通过使用终结器,而不是依赖于某人不会忘记编写 using

关于c# - 当 IDisposable 对象未在方法中释放时,为什么没有编译器或分析器警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72775316/

相关文章:

c# - WebClient DownloadString UTF-8 不显示国际字符

c# - 使用后处理 ObjectContext(每个请求)

c# - DataGridView 显示行标题单元格

c# - 如何等到内存被释放?

c# - 如何将字符串行转换为类

entity-framework-4 - 超出范围时,Ninject 不会对对象调用 Dispose

c# - 如何正确处理 WebResponse 实例?

c# - 有没有办法在 C# 中编写一次性 (UnlockBits) 位图?

c# - 在 C# 中处理对象破坏的最佳方法是什么

c# - 设置 IDisposable 属性时调用 Dispose?