好的,假设我有一个程序可以创建一个WebRequest并获取一个WebResponse,并在using语句中使用该WebResponse作为StreamReader,这显然会在之后被处理掉,但WebResponse流呢?例如:
WebResponse response = request.GetResponse();
using(StreamReader reader = new StreamReader(response.GetResponseStream()))
{
x = reader.ReadToEnd();
}
很明显,StreamReader将会被淘汰,并且所有资源都用于它,但是响应中的响应流呢?那样吗?或者我应该这样做:
WebResponse response = request.GetResponse();
using(Stream stream = response.GetResponseStream())
{
using(StreamReader reader = new StreamReader(stream))
{
x = reader.ReadToEnd();
}
}
由于
答案 0 :(得分:2)
StreamReader假定您传递给其构造函数的Stream的所有权。换句话说,当您处理StreamReader对象时,它将自动处理您传递的Stream对象。这非常方便,正是您想要的,将代码简化为:
using (var response = request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
x = reader.ReadToEnd();
}
答案 1 :(得分:0)
当我使用Visual Studio 2013的代码分析时,它声称在这里使用两个'usings'将导致Dispose()在'response'上被调用两次并将生成一个隐藏的'System.ObjectDisposedException'?
警告CA2202:Microsoft.Usage:可以处理对象'响应' 方法'xxx'不止一次。为了避免产生 System.ObjectDisposedException你不应该调用Dispose 一次在一个物体上。
有没有人见过这个?