代码之家  ›  专栏  ›  技术社区  ›  DaveB

C#using语句是否可以不用花括号编写?

c#
  •  39
  • DaveB  · 技术社区  · 14 年前

    我今天浏览了一个同事的c代码,发现如下:

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

    我一直看到 using 语句,后跟一对大括号,大括号定义了对象生命的范围。我写代码的同事说 data1 语句是不需要的,代码做了相同的事情,就好像它们存在并嵌套在 data2 使用 声明。那么,当使用花括号时会发生什么呢?

    7 回复  |  直到 5 年前
        1
  •  109
  •   Albin Sunnanbo    14 年前

    是的,您也可以将它们放在一个using语句中:

    using (MemoryStream data1 = new MemoryStream(), 
                        data2 = new MemoryStream())
    {
        // do stuff
    }
    
        2
  •  19
  •   Chuck Conway    14 年前

    同样的规则也适用于在一个例子中省略花括号的情况 for 或者一个 if

    顺便说一句,如果您反映到编译的代码中 编译程序 反编译器添加大括号。

        3
  •  17
  •   abatishchev Marc Gravell    13 年前

    正是他说的。上面的代码与编写代码完全相同:

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

    只要if/else/for/while/using/etc语句中只有一个命令,就可以省略if/else/for/while/using/etc语句后面的大括号。示例:

    // 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();
    }
    
        4
  •  14
  •   JvR    4 年前
        5
  •  4
  •   Jimmy Hoffa    14 年前

    这是可行的,但也有风险,因为如果有人后来决定在data1发生其他事情之前对它做一些事情,他们可能会在data1使用之后立即将其放置,这将使它脱离data2的整个使用范围。这可能会破坏编译,但仍然是一个危险和毫无意义的语法捷径。。

        6
  •  3
  •   fletcher    14 年前

    正如你的同事所说,这就相当于把这些陈述嵌套起来。处置 data2 将在的dispose函数之前立即调用 data1 .

        7
  •  2
  •   IAmJersh    6 年前

    if(foo)
      if(bar)
      {
         doStuff();
      }
    
        8
  •  1
  •   jwaliszko    14 年前

    如果语句后面只有一条指令,则不需要大括号。就跟你一样 if

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

    意思是一样的

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