使用"使用块"时感到困惑 - C#

Min*_*ang 1 .net c# idisposable using

我经常使用"使用"块来处理对象.今天,我使用HttpWebRequest发布数据,我感到两种方法之间的混淆.

方法1:

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

方法2:

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

在方法2中,所有流和streamwirter都在"使用"块中,因此肯定会被丢弃.但是在方法1中,我不确定流请求.GetRequestStream()将被处置.有谁可以向我解释一下?非常感谢!

Jon*_*eet 9

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

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

所以基本上,我认为在这种情况下它是安全的......当你的using陈述处理掉时StreamWriter,会处理掉Stream.

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


adv*_*v12 5

一个StreamWriter包装一个Stream在关闭时会关闭该流.查看文档.