C# 单语句何时需要大括号?
在我的回答中:,指出C# 单语句何时需要大括号?,c#,curly-braces,curly-brackets,C#,Curly Braces,Curly Brackets,在我的回答中:,指出try…catch…(finally)语句需要大括号 我找到了原因的答案,在这里发现()非常有趣 我想知道更多的例子,其中需要大括号,而不是良好的实践等等,最好是在方法体周围有代码片段和解释 // not allowed: int Inc(int x) return x+1; 为什么不是那么容易,似乎老式C比C++/C更需要它 关于“为什么”部分的更多信息,在(非常)古老的C语言中,您可以编写 int Sum() int a, b; // parameters
try…catch…(finally)
语句需要大括号
我找到了原因的答案,在这里发现()非常有趣
我想知道更多的例子,其中需要大括号,而不是良好的实践等等,最好是在方法体周围有代码片段和解释
// not allowed:
int Inc(int x)
return x+1;
为什么不是那么容易,似乎老式C比C++/C更需要它
关于“为什么”部分的更多信息,在(非常)古老的C语言中,您可以编写
int Sum()
int a, b; // parameters, very informal
{
int s; // local var
...
}
所以这个古老的语法需要大括号。在所有基于C语言的语言中,假设在某些情况下这是可能的,那么没有人认为让它们成为可选的有意义。class/struct/interface declaration 类X{int_myval} 必须将大括号或圆括号与and一起使用,具体取决于您是将它们视为运算符还是语句:
// legal operator
int y = checked(x * 2);
// legal statement
unchecked
{
if ((a * b) > c)
{
DoSomething();
}
}
// illegal operator
int y = checked x * 2;
// illegal statement
unchecked
if ((a * b) > c)
DoSomething();
语言的某些部分需要大括号。例如,当启动一个方法时,必须打开和关闭大括号以将其标识为代码块。在函数内部,某些语言特性(如循环、条件语句等)也接受大括号,尽管在某些情况下它们不是必需的。例如:
if (someValue == true)
doSomething();
在这种情况下,不需要大括号,但是可以用大括号括住该语句,因为只有一条语句将在if检查后执行,但如果要在if中执行多条语句,则需要使用大括号。比如说,
if (someValue == true)
{
doSomething();
doSomeMoreWork();
}
这样的尝试是不允许的:
if (someValue == true)
doSomething();
doSomeMore();
else
doWork2();
int i = 1 + 2;
在这种情况下,编译器会投诉
在以下循环中可以最好地看到问题:
while(i < 10)
doSomeWork();
i++;
while(i<10)
doSomeWork();
i++;
在这里,你会期望我增加,但这永远不会发生。基本上,这个循环与这个循环相同:
while(i < 10)
{
doSomeWork();
}
i++;
while(i<10)
{
doSomeWork();
}
i++;
块内的语句将以内联方式执行,并且我永远不会递增。在这种情况下,编写此声明的正确方式是:
while(i < 10)
{
doSomeWork();
i++;
}
while(i<10)
{
doSomeWork();
i++;
}
现在您有了一个正常工作的声明。我喜欢一直使用大括号,不管执行的语句有多少。原因是迟早我可能需要在if语句或for或foreach循环中添加更多的工作。这只是一个很好的实践。如果你使用“剃须刀”,它们总是必需的。实际上我有点希望我有一个csc的编译器开关来启用这个模式。同意,我发现在if等下有一行语句。当添加
{…}
时,可读性更高。这件衣服又脏又卷曲你能想出一个原因吗?我在想什么时候会有歧义(比如答案re.the try…catch-example),但是不能。在C#语法中可能会使它们成为可选的,但是为什么设计者甚至会列出它呢?是的,但语法的不同部分。类不包含语句而是声明。要强调的是,运算符/表达式版本checked()
的存在很好地回答了这里的“为什么”部分。@亨克:的确,尽管我不明白为什么编译器不能执行某种上下文分析来确定使用的是哪个版本。(但仅仅因为我看不到潜在的陷阱并不意味着没有任何陷阱。我肯定会有一些棘手的情况。只执行大括号/括号规则更容易,也不那么模棱两可。)也许最好将其分为两个答案。开关盒为标签
,如转到标签12
并遵循该语法模式。不过对于开关和作用域有一些特殊的规则。@Henk:True。我想我可以把开关
的东西全部删除;我只是出于好奇才提出来的。尽管开关部分不仅仅是简单的标记语句。例如,编译器不允许切换部分从一种情况切换到另一种情况。我仍然认为switch
某种程度上符合问题的“需要大括号”精神。例如,while(expression){}
是合法的,while(expression)也是合法的代码>,而开关(表达式){}
是合法的,但开关(表达式)代码>不是。@Downvoter有什么特别的原因导致帖子被否决吗?Huske,答案很长,但完全没有回答这个问题。我不太同意你的观点,Henk,但很公平。我认为回答何时以及为什么需要大括号是相当困难的,所以我试着想象一些案例,并给出何时以及如何使用大括号的想法。我想乔治可能已经选择了一个更具体的标题。