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

标签 c# .net using idisposable

我经常使用“using” block 来处理对象。 今天,我使用 HttpWebRequest 来发布数据,我对这两种方法感到困惑。

方法一:

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));
}

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

最佳答案

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

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

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

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

关于c# - 使用 "using block"时感到困惑 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077512/

相关文章:

c# - session 过期后从数据库中删除它吗?

c# - 如何使用 FindChessboardCorners

c# - 边框不会显示在 WPF 控件中

c# - 如何在不重新打开文件的情况下读取然后写入/附加到文本文件?

c# - 触发 SelectedIndexChanged 后列表框在视觉上卡住

c# - 另一个缩短SQL字符串? C#

c# - 尝试/捕获 Image.FromStream() 而不捕获 using 语句的其余部分?

c# - 将 block 与套接字一起使用

c++ - 别名表达式的最佳方法

.net - 使用来自 webapi 的 HttpClient 使用 xml