C# 在单行条件下省略大括号的具体规则是什么
我遇到了一行代码,如下所示:C# 在单行条件下省略大括号的具体规则是什么,c#,C#,我遇到了一行代码,如下所示: if (condition) // Someone added a comment here return "something"; return "something else"; 我认为“something”总是会被返回,但事实并非如此,尽管有注释if/condition按照开发人员的意图工作 我一直在努力寻找这方面的规则。当存在无括号条件时,实际代码的下一个有效行是否会像在大括号中一样执行?所以在有效代码行之前,我可以有任意多的空行和注释
if (condition)
// Someone added a comment here
return "something";
return "something else";
我认为“something”总是会被返回,但事实并非如此,尽管有注释if/condition按照开发人员的意图工作
我一直在努力寻找这方面的规则。当存在无括号条件时,实际代码的下一个有效行是否会像在大括号中一样执行?所以在有效代码行之前,我可以有任意多的空行和注释
我以为“某物”总会被归还,但那不是真的
否,如果条件
为真
,则返回“某物”
。它按预期工作,注释不包括在代码的评估中。看这把小提琴:上面写着:
从概念上讲,程序的编译分为三个步骤:
static void Main(string[] args)
{
if
(true
)
/* comment separating `)` token from the `Console` token */
Console.WriteLine("something") /* another comment, semicolon token to the right */;
else // bunch of white space to the left
Console.
WriteLine("something else")
;
}
Main()方法的ILSpy输出:
清洁剂显示相同的ILSpy输出:
static void Main(string[] args)
{
if (true) Console.WriteLine("something"); else Console.WriteLine("something else");
}
第二版本的ILSpy输出:
.method private hidebysig static
void Main(
string[] args
) cil managed
{
// Method begins at RVA 0x2088
// Code size 17 (0x11)
.maxstack 1
.entrypoint
.locals init (
[0] bool
)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldstr "something"
IL_0008: call void[mscorlib]
System.Console::WriteLine(string)
IL_000d: nop
IL_000e: br.s IL_0010
IL_0010: ret
} // end of method Program::Main
好的假设。试试看,规则是按照你所说的去做的。明智的程序员总是使用大括号!“对于单个语句,大括号是可选的,但建议使用。”“尽管有注释”-编译器忽略comments@KernelMode-关于?谢谢。这就是我所希望的解释。
.method private hidebysig static
void Main(
string[] args
) cil managed
{
// Method begins at RVA 0x2088
// Code size 17 (0x11)
.maxstack 1
.entrypoint
.locals init (
[0] bool
)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldstr "something"
IL_0008: call void[mscorlib]
System.Console::WriteLine(string)
IL_000d: nop
IL_000e: br.s IL_0010
IL_0010: ret
} // end of method Program::Main