为什么这段代码中的流是打开的?

本文关键字:段代码 代码 为什么 | 更新日期: 2023-09-27 18:15:51

我有一个问题从一段代码从书中: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 ?为什么只有响应对象是关闭的?

为什么这段代码中的流是打开的?

调用WebResponse。Close隐式关闭响应流。

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

Close方法清除WebResponse使用的资源,并通过调用流来关闭底层流。关闭方法。

正如nsgocev所说,文档说在WebResponse上调用Close会关闭底层流。所以没有必要再关闭它。

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

至少,代码应该利用"using"语法糖(编译器将其扩展为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
    }
  }