将“using”语句与将它们逐个组合使用是一样的吗?

时间:2016-09-23 09:49:15

标签: c#

注意:我很抱歉这个奇怪的标题,但我无法找出更好的标题,随时可以编辑。

所以我对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);
                }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:7)

嗯,嗯,它是一样的。这里的规则与嵌套的'if'语句相同:

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