我对这本书的一段代码有疑问:
用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?为什么只关闭响应对象?

最佳答案

正如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
    }
  }

08-03 19:32