为什么在此代码中流保持打开状态?

时间:2014-08-01 04:19:05

标签: c# stream

我从书中的一段代码中得到一个问题: 用C#编程 考试70-483 这是代码:

WebRequest request = WebRequest.Create(“http://www.microsoft.com”);
WebResponse response = request.GetResponse();
StreamReader responseStream = new StreamReader(response.GetResponseStream());
string responseText = responseStream.ReadToEnd();
Console.WriteLine(responseText); // Displays the HTML of the website
response.Close();

我的问题是为什么在这个例子中没有关闭responseStream?为什么只关闭响应对象?

2 个答案:

答案 0 :(得分:5)

调用WebResponse.Close implicity关闭响应流。

从这里采取 - http://msdn.microsoft.com/en-us/library/system.net.webresponse.close(v=vs.110).aspx

  

Close方法清除WebResponse使用的资源,并通过调用Stream.Close方法关闭基础流。

答案 1 :(得分:3)

正如nsgocev所说,文档说在WebResponse上调用Close会关闭底层流。所以试图再次关闭它是没有意义的。

但我无法回应并指出示例中的代码没有做任何事情来保护自己免受资源泄漏。如果发生异常,无论是在您的代码中还是与远程Web服务器的通信中,响应都不会被关闭,并且不会释放基础流,这意味着TCP套接字可能不会被释放,等等。

至少,代码应该利用“使用”语法糖(编译器扩展到try / finally)来保护自己并保证资源被释放:

using( WebRequest request = WebRequest.Create( “http://www.microsoft.com” ) )
  {
  using( WebResponse response = request.GetResponse() )
    {
    StreamReader responseStream = new StreamReader( response.GetResponseStream() );
    string responseText = responseStream.ReadToEnd();
    Console.WriteLine( responseText ); // Displays the HTML of the website
    }
  }