示例代码:
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();
鉴于这可能是资源泄漏的根源,为什么这种情况下没有编译器警告或分析器规则?
这似乎是一个明显需要检查的事情,因此我怀疑这种遗漏是有充分理由的。
最佳答案
编辑:删除了忽略 StreamWriter
的 leaveOpen
构造函数参数的错误示例。经过重新思考,我还意识到,除非调用 Dispose
,否则数据将保持未刷新状态,因此 dispose 是正确的调用。
我很确定这是因为您并不总是想要Dispose
对象。例如,Task
对象是IDisposable
,但您通常不会显式处置它们。可能还有更多这样的类型,即很少分配非托管资源的类型,并且只有在它们的终结器减慢应用程序速度时才应处置它们。
此外,如果您的类具有无论如何都需要处置的非托管资源,那么它应该实现 Dispose Pattern通过使用终结器,而不是依赖于某人不会忘记编写 using
。
关于c# - 当 IDisposable 对象未在方法中释放时,为什么没有编译器或分析器警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72775316/