我有一个问题从一段代码从书中: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
}
}