代码块没有句法意义

时间:2014-09-23 07:28:31

标签: c# indentation

有时我会看到如下代码而实际上并不知道它的含义:

void myFunc() {
    MyClass a = new MyClass();

    {
        if (a.b == null) // doSomething
    }
}

我真的很喜欢这种代码排序和封装(不仅因为如果你不读它的内容你可能会立刻崩溃整个块),但是我想知道它是否还有光学上的任何语法意义缩进。 OFC。我知道,就像在每个代码块中一样,块中声明的任何变量只能在那里使用,但是还有更多。还有对象初始化器,但是对于类的实际实例而言,上面是一个完全独立的块。

2 个答案:

答案 0 :(得分:3)

  

我想知道它是否除了光学压痕之外还有任何语法含义

不,他们没什么特别的。 C#语言将块声明为封装可选语句列表的一对括号,并观察到允许多个语句写入允许单个语句的位置。

这反过来简化了语言规范的其他部分,例如iffor等,然后可以将它们指定为好像它们只跟随一个语句

事实上,这意味着您也可以在其他任何地方使用它们,这大多是一件快乐的事故。

您可以在C# language spec

的8.2节中阅读完整规范

答案 1 :(得分:0)

像你描述的那样构建

void myFunc() {
    MyClass a = new MyClass();

    {
        if (a.b == null) // doSomething
    }
}

主要用于你喜欢它们的同一件事。只是出于光学原因并能够折叠这些部件。它们也可用于变量范围,但与其他目的相比,它很少使用。

可能的替代方案(仅考虑光学原因)将使用区域来实现相同的结果。虽然它的缺点是你必须写的不仅仅是{},但你可以声明代码部分的内容。

void myFunc() {
    MyClass a = new MyClass();

    #region Setting the players base stats
        if (a.b == null) // doSomething
    #endregion
}

这种方法对变量作用域没有任何作用,但至少可以让你知道它未显示的内容(如果区域被折叠)。这两种方法也可以组合在一起(因此在区域内部为{},以便您可以封装变量)。

void myFunc() {
    MyClass a = new MyClass();

    #region Setting the players base stats
    {
        if (a.b == null) // doSomething
    }
    #endregion
}

但回到你的问题,除了光学原因和变量范围之外,没有语法上的理由去做。