Can the C# using statement be written without the curly braces?

后端 未结 8 1012
陌清茗
陌清茗 2021-02-04 23:49

I was browsing a coworkers c# code today and found the following:

    using (MemoryStream data1 = new MemoryStream())
    using (MemoryStream data2 = new MemoryS         


        
相关标签:
8条回答
  • 2021-02-05 00:11

    If there is only one instruction which follow the statement, the bracets are not needed. It is just like with if statement.

    if(true)
    {
       Console.Writeline("hello")
    }
    

    means the same that

    if(true)
       Console.Writeline("hello")
    
    0 讨论(0)
  • 2021-02-05 00:12

    The same rules apply when you omit the curly braces in a for or an if statement.

    Incidentally if you reflect into the compiled code, the compiler decompiler adds the braces.

    0 讨论(0)
  • 2021-02-05 00:12

    Exactly what he said. The code above is exactly the same as writing:

    using (MemoryStream data1 = new MemoryStream()) 
    {
        using (MemoryStream data2 = new MemoryStream())
        {
            // Lots of code
        }
    }
    

    You can omit the curly braces after an if/else/for/while/using/etc statement as long as there is only one command within the statement. Examples:

    // Equivalent!
    if (x==6) 
        str = "x is 6";
    
    if(x == 6) {
        str = "x is 6";
    }
    
    // Equivalent!
    for (int x = 0; x < 10; ++x) z.doStuff();
    
    for (int x = 0; x < 10; ++x) {
        z.doStuff();
    }
    
    // NOT Equivalent! (The first one ONLY wraps the p = "bob";!)
    if (x == 5) 
    p = "bob";
    z.doStuff();
    
    if (x == 5) {
       p = "bob";
       z.doStuff();
    }
    
    0 讨论(0)
  • 2021-02-05 00:12

    Exactly what your colleague said, that is the equivalent of nesting the statements. The dispose for data2 would be called immediately before the dispose function for data1.

    0 讨论(0)
  • 2021-02-05 00:15

    As people have said: given there only being one line following a statement it will work without the curled braces. However, people are neglecting to show in their examples that that one line can be an if/using/for with it's own curled braces. Here is an example:

    if(foo)
      if(bar)
      {
         doStuff();
      }
    
    0 讨论(0)
  • 2021-02-05 00:16

    Yes, you can also put them in one using statement:

    using (MemoryStream data1 = new MemoryStream(), 
                        data2 = new MemoryStream())
    {
        // do stuff
    }
    
    0 讨论(0)
提交回复
热议问题