C# 关闭或处置

C# 关闭或处置,c#,.net,C#,.net,StreamReader类同时具有close和dispose方法。我想知道调用哪个方法来清理所有资源 如果使用using块,我想它会调用它的dispose方法。清理所有资源就足够了。using块就是您所需要的。using块将调用StreamReader实例上的Dispose()。一般来说,如果类型是IDisposable,则应使用范围将其放入 编辑: 如果查看使用Reflector的StreamReader的Close()实现,您将看到它正在调用Dispose(true)。因此,如果您没有使用u

StreamReader类同时具有close和dispose方法。我想知道调用哪个方法来清理所有资源


如果使用using块,我想它会调用它的dispose方法。清理所有资源就足够了。

using块就是您所需要的。

using块将调用
StreamReader
实例上的
Dispose()
。一般来说,如果类型是
IDisposable
,则应使用
范围将其放入

编辑: 如果查看使用Reflector的
StreamReader
Close()
实现,您将看到它正在调用
Dispose(true)
。因此,如果您没有使用
using
作用域,在这种特殊情况下,手动调用
Close()
与调用
Dispose()
是一样的

protected override void Dispose(bool disposing)
{
    try
    {
        if ((this.Closable && disposing) && (this.stream != null))
        {
            this.stream.Close();
        }
    }
    finally
    {
        if (this.Closable && (this.stream != null))
        {
            this.stream = null;
            this.encoding = null;
            this.decoder = null;
            this.byteBuffer = null;
            this.charBuffer = null;
            this.charPos = 0;
            this.charLen = 0;
            base.Dispose(disposing);
        }
    }
}

如果您想了解有关使用
的更多信息,请查看此处

网站报价:

using语句允许 程序员要指定对象的时间 使用资源应该释放 他们。提供给用户的对象 语句必须实现 IDisposable接口。此接口 提供Dispose方法,该方法 应该释放对象的资源


似乎有人担心
Dispose
是否真的能正常工作

本质上-您可以相当肯定,当调用dispose时,BCL(基类库)中实现了
IDisposable
的任何东西都会正确地整理自己,例如当using语句超出范围时


如果流未关闭时出现问题,那么现在应该已经解决了-您可以信任
IDisposable
。当您使用其他库时,您依赖于
Dispose
实现。

通过using块使用Dispose以确保进行清理

如果在使用块结束之前相当长的时间内完成了对象,请使用Close,以便尽可能及时地释放任何资源


因此,这两种方法将协同工作,尽管如果您要在几纳秒内到达块的末尾,后者可能是多余的。

我们都知道
System.IO.StreamReader
并不是实现
IDisposable
Close()
方法的唯一.NET 4.0+类。对于这个问题中的
StreamReader
,源代码显示基类都运行相同的代码行。您还可以在代码中看到,
TextReader.Dispose()
是调用
StreamReader.Dispose()
时的实现(因为
StreamReader
不会覆盖
Dispose
的方法重载签名)

因此,将运行对
StreamReader.Dispose()
的调用,该调用调用受保护的覆盖方法,因此将调用
StreamReader.Dispose(disposing:true)
。因此,对于
StreamReader
Close()
Dispose()
确实运行相同的代码行

对于Close()或Dispose()的问题,一个更一般的、非特定于类的答案可能是,微软已经相当清楚了。快速阅读足以告诉您实现
Close()
方法不是Dispose模式的要求

我想,在这么多实现了
IDisposable
的类上找到方法
Close()
的原因是惯例的结果,而不是需求

有人评论说


另一个类的示例,该类使用Dispose模式实现了
IDisposable
,并具有
Close()
方法。在这种情况下,
Close()
是否运行与
Dispose()
相同的代码?我没有看过源代码,但我想说不一定

使用将保证调用dispose。这与调用close相同吗?dispose将隐式关闭流…除非您使用长寿命对象编写“复杂”代码。更好的建议是:在语法上可能的情况下使用using。Else像对待大孩子一样小心地处理自内存分配发明以来编程世界所处理的复杂性。close调用dispose(true),using block也会调用dispose(true)?这解释了为什么如果在
中有代码,则使用
调用
close()
,运行Visual Studio的代码分析后,您将得到CA2202不要多次处置对象——因为Close()已经处置,而使用最终将再次尝试处置对象。我想知道,那么。。。为什么我们不真正面对系统.ObjectDisposedException