代码块没有语法意义

3
有时我看到像以下这样的代码,但实际上并不知道它的含义:
void myFunc() {
    MyClass a = new MyClass();

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

我真的很喜欢这种代码排序和封装(不仅因为如果你不想读它的内容,你可以一次性折叠整个块),但我想知道它是否有任何语法意义,除了视觉缩进之外。当然,我知道在每个代码块中声明的任何变量只能在该块中使用,但还有更多吗?也有对象初始化器,但是由于它们涉及到类的实际实例,因此上述是一个完全独立的块。


4
据我所知,“自由”代码块的唯一语法含义是限定变量的作用域。 - Jodrell
我还没有真正看到这个...不过很有趣... - Noctis
除了变量作用域之外,我认为还有一种隐含的可能性,即使用“break”语句有条件地将控制转移到块的末尾? - Wim Ombelets
1
@WimOmbelets - 不,break 明确与一个封闭语句 (switch, while, do, for, 或 foreach) 相关联,并且如果没有这样的封闭语句,它会产生编译时错误。请参阅语言规范的第 8.9.1 节(链接在我的回答中)。 - Damien_The_Unbeliever
https://dev59.com/3nVC5IYBdhLWcg3wliGe - CodeCaster
显示剩余3条评论
2个回答

3

我不确定它是否有语法意义,除了光学缩进

不,它们并没有特殊之处。C#语言将块声明为封装可选语句列表的一对大括号,并观察到这个“允许”多个语句在单个语句允许的位置书写。

这反过来简化了语言规范的其他部分,例如iffor等,然后只需指定它们是否总是后跟一个单个语句。

事实上,这意味着你也可以在任何其他地方使用它们,这主要是一种愉快的偶然。

您可以在C#语言规范的第8.2节中阅读完整规范。


了解“if”语句及其它所有部件的幕后工作原理很重要。 - MakePeaceGreatAgain

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
}

但是回到你的问题,除了光学原因和变量作用域之外,没有语法上的理由来做这件事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接