使用 "using block" 时感到困惑 - C#

confused when using "using block" - C#

我经常使用 "using" 块来处理对象。 今天,我使用 HttpWebRequest 获取 post 数据,我对这两种方法感到困惑。

方法一:

var request = (HttpWebRequest)WebRequest.Create("http://www...");
using (var writer = new StreamWriter(request.GetRequestStream()))
{
    writer.Write(JsonConvert.SerializeObject(content));
}

方法二:

var request = (HttpWebRequest)WebRequest.Create("http://www...");
using (var stream = request.GetRequestStream())
using (var writer = new StreamWriter(stream))
{
    writer.Write(JsonConvert.SerializeObject(content));
}

方法2中,"using"块中的所有stream和streamwirter,肯定会被dispose。但是在方法 1 中,我不确定流 request.GetRequestStream() 是否会被处理。谁能给我解释一下?非常感谢!

A StreamWriter 包装 Stream 将在关闭时关闭该流。见 docs.

基本上,这取决于两件事:

  • StreamWriter 构造函数在传递非空 Stream 引用时是否会抛出异常 - 我认为在这种情况下不会。 (如果流是只读的,它会......此时流不会被释放。)
  • 是否 StreamWriter.Dispose 处理底层流 - 它确实处理了,除非你调用了 constructor overload ,它明确允许你控制

所以基本上,我相信在这种情况下是安全的...当您的 using 语句处理 StreamWriter 时,将处理 Stream.

但是,如评论中所述,使用两个 using 语句意味着您不需要执行这种推理。

两者是一样的。由于 using block 处置整个对象,甚至是匿名对象。