1

好的,假设我有一个程序,它生成一个 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();
   }
}

谢谢

4

2 回答 2

2

StreamReader 假定您传递给其构造函数的 Stream 的所有权。换句话说,当您释放 StreamReader 对象时,它也会自动释放您传递的 Stream 对象。这非常方便,正是您想要的,将代码简化为:

using (var response = request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
   x = reader.ReadToEnd();
}
于 2013-10-01T11:09:17.027 回答
0

当我使用 Visual Studio 2013 的代码分析时,它声称在此处使用两个“使用”将导致 Dispose() 在“响应”上被调用两次,并会生成隐藏的“System.ObjectDisposedException”?

警告 CA2202:Microsoft.Usage:对象“响应”可以在方法“xxx”中多次处理。为避免生成 System.ObjectDisposedException,您不应在一个对象上多次调用 Dispose。

有没有其他人看过这个?

于 2016-03-15T23:22:08.520 回答