使用 "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 处置整个对象,甚至是匿名对象。
我经常使用 "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 处置整个对象,甚至是匿名对象。