我对这本书的一段代码有疑问:
用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
}
}