注意:我很抱歉这个奇怪的标题,但我无法找出更好的标题,随时可以编辑。
所以我对C#中的using
块有一个非常简单的问题。我知道它的作用以及为什么要在IO和网络操作上使用它,但我需要知道是否将它们分组是正常的,因为如果我有多个它们就太多了。
所以基本上问题很简单:下面这两个函数是否相同?或者我应该使用后一个多级缩进?
public static async Task ReadStuffUsingTogether()
{
using (var client = new HttpClient())
using (var response = await client.GetAsync("http://bigfile.com/file.csv", HttpCompletionOption.ResponseHeadersRead))
using (var fileStream = await response.Content.ReadAsStreamAsync())
using (var writeStream = File.Open("1.csv", FileMode.Create))
{
await fileStream.CopyToAsync(writeStream);
}
}
// Too much identation in my opinion
public static async Task ReadStuffUsing()
{
using (var client = new HttpClient())
{
using (var response = await client.GetAsync("http://bigfile.com/file.csv", HttpCompletionOption.ResponseHeadersRead))
{
using (var fileStream = await response.Content.ReadAsStreamAsync())
{
using (var writeStream = File.Open("1.csv", FileMode.Create))
{
await fileStream.CopyToAsync(writeStream);
}
}
}
}
}
答案 0 :(得分:7)
if(x)
if(y)
if(z) DoSomething();
或者:
if(x)
{
if(y)
{
if(z)
{
DoSomething();
.. some other code
}
}
}
两者之间的主要区别在于,使用大括号可以添加代码的块,而不需要 - 只有一行
答案 1 :(得分:4)
是的,在您的情况下将它们组合在一起逐个进行。
using
的语法打开单语句范围,与for
循环或if
语句的方式相同。你把它们格式化为另一个;缩进不会改变任何东西,因为C#会忽略空格:
using (var client = new HttpClient())
using (var response = await client.GetAsync("http://bigfile.com/file.csv", HttpCompletionOption.ResponseHeadersRead))
using (var fileStream = await response.Content.ReadAsStreamAsync())
using (var writeStream = File.Open("1.csv", FileMode.Create))
{
await fileStream.CopyToAsync(writeStream);
}
它稍微限制了您的使用量,因为您无法在一个using
结束后但在下一个结束之前添加更多代码:
using (var fileStream = await response.Content.ReadAsStreamAsync())
{
using (var writeStream = File.Open("1.csv", FileMode.Create))
{
await fileStream.CopyToAsync(writeStream);
}
// Do something else with fileStream
log.Info("Read {0} bytes from fileStream", fileStream.Position);
}
但是,如果没有必要,可以跳过花括号的嵌套。
答案 2 :(得分:2)
它们完全相同,您利用的事实是,只有一个语句的任何块都可以省略{
和}
它与这样做的意思相同
if(someCondition)
Console.WriteLine("foo");