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