在.NET中处理资源

Or *_*r A 5 c# memory garbage-collection idisposable

我有一个愚蠢的问题,但我想在这里听到社区.

所以这是我的代码:

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) 
{ 
      return true; 
} 
Run Code Online (Sandbox Code Playgroud)

我的问题是,它有什么不同于:

(FtpWebResponse)request.GetResponse();
return true;
Run Code Online (Sandbox Code Playgroud)

一般哪个更好?哪个就GC而言?为什么?

Rex*_*x M 11

第一个更好,但不是GC.WebResponse实现IDisposable,因为它需要被释放,如网络连接,存储流等资源IDisposable到位,因为你作为消费者,知道你什么时候这个对象,你打电话Dispose通知您已处理完毕的类它,它可以自由清理.

这个using模式真的只是Dispose在引擎盖下打电话.例如,您的第一个示例实际编译为:

FtpWebResponse response = (FtpWebResponse)request.GetResponse()
try
{
}
finally
{
    ((IDisposable)response).Dispose();
}
return true;
Run Code Online (Sandbox Code Playgroud)

这与垃圾收集器分开.一个类也可以清理终结器中的资源,它可以从GC调用,但是你不应该依赖它来解决这个问题有两个原因:

  1. 在GC最终到来之前可能需要很长时间,这意味着这些资源无需充分理由就会被消耗掉.
  2. 无论如何,它实际上可能无法清理终结器中的资源

  • @或者A:无论你是否关心响应,你仍然在调用`GetResponse`,这意味着仍然需要处理返回的对象.(推荐的模式通常是`using`块.) (6认同)

Ode*_*ded 7

第一个更好.

不同之处在于using语句将对包含在其中的对象调用dispose.它将正确处理所持有的资源.

MSDN,using语句:

提供方便的语法,确保正确使用IDisposable对象.