我们什么时候需要在dot net c#中调用Dispose()?

我们什么时候需要在dot net c#中调用Dispose()?,c#,.net,dispose,C#,.net,Dispose,创建sqldatareader后是否需要处置它 SqlDataReader reader; --- --- --- reader.Close(); reader.Dispose(); 一次性物品最好在使用块中使用(如果可能)。在使用块结束时,对象将自动释放 由于内存管理,如果您不再需要对象,建议您处置它们 阅读MSDN。经验法则:如果一个类实现了,您应该在使用完此资源后立即调用该方法。更好的方法是将其包装为,以确保即使引发异常也会调用Dispose方法: using (var reader =

创建sqldatareader后是否需要处置它

SqlDataReader reader;
---
---
---
reader.Close();
reader.Dispose();

一次性物品最好在使用块中使用(如果可能)。在使用块结束时,对象将自动释放

由于内存管理,如果您不再需要对象,建议您处置它们


阅读MSDN。

经验法则:如果一个类实现了,您应该在使用完此资源后立即调用该方法。更好的方法是将其包装为,以确保即使引发异常也会调用Dispose方法:

using (var reader = conn.ExecuteReader())
{
    ...
}

在处理实现IDisposable的任何内容时,建议使用该模式

using ()
{
    // use it here
}
这将处理try..catch..finally构造和调用Dispose


编辑我之前说过,我认为Close和Dispose对阅读器(流、文件、sqldatareader等)也做了同样的事情,但从sqldatareader上的文档来看,这似乎不是真的,所以我的假设是错误的

有一个简单的指导原则:如果您已经完成了一个对象,其类型实现了
IDisposable
,那么就对其调用
Dispose()
;您应该使用
using
块来执行此操作。

我认为Close不会处理可能的重复项。但是处置closes@Oskar当前位置我认为这是一个有趣的讨论。如果查看.NET中的源代码,您会发现某些类型在执行
Close
Dispose
时的行为相同,而其他类型则不同。我认为可以肯定地说,你不应该指望
Close
来适当地释放你的资源。例如,
SqlConnection
在调用this时不调用
GC.SuppressFinalize(this)
,这会迫使对象的生存时间远远超过严格需要的时间。因此,您可以得出结论,您的陈述是正确的,并且指导原则是:如果实例实现了
IDisposable
:您应该调用dispose。这是一般的经验法则,但是,这样做并不总是可行的。有些类实现IDisposable有些不必要,比如一些迭代器。例如,列表的迭代器实际上不需要调用其dispose方法。类似地,一些WinForms控件实际上在dispose方法中不做任何事情,但它们实现它是因为它们必须(由于继承)。最后,如果在程序结束之前需要底层非托管资源(如程序的主窗体),您可以不调用Dispose而放弃。如果例程或类通过直接构造函数调用以外的任何方式获得可继承类的IDisposable对象的所有权,则必须考虑到相关对象的类可能需要调用IDisposable.Dispose。在大多数情况下,确保一个习惯的问题,处理将被调用,而不是担心的情况下,一个人可以通过没有它。