这是一个非常简单的问题,但在我向前推进之前我想知道这个问题,所以我理解这个过程。
在我关注的教程中,我使用的是if语句。如果您执行以下代码,则无需使用{}
if (userValue == "1")
message = "You won a new car!";
但是如果您使用多行代码,则需要{}。
if (userValue == "1")
{
WriteLine ("You won a new car!");
ReadLine ();
}
有人可以用非常简单的术语向我解释为什么会这样吗?我只需要一个经验法则,这样我就可以理解为什么。没有什么过于复杂我只是一个初学者。我知道他们识别了一段代码,但我不确定为什么这会在一两行之间产生差异?
答案 0 :(得分:7)
这些被称为blocks。
一个块允许在允许单个语句的上下文中写入多个语句。
它们用于将一个或多个语句组合在一起。在像if
语句这样的控制结构中,它们用于使块内的所有语句都是有条件的,而不仅仅是紧跟在if
语句之后的语句。
块也有自己的scope,这意味着块内定义的变量不能在块外引用,并且不同块中的两个变量是不同的,即使它们具有相同的名称。
大多数编程语言都有某种块,而且C#使用花括号来分隔它们这一事实将它放在一个语法相关的语言系列curly-brace languages,以及C,C ++,Java和许多语言中。更多。
答案 1 :(得分:5)
在您的示例中,{}
指定了一个代码块。您可以轻松地将第一个写为
if (userValue == "1")
{
message = "You won a new car!";
}
有时,当块只包含一个语句时,您可以省略{}
。
if (userValue == "1")
message = "You won a new car!";
然而,大多数人考虑使用括号,即使它们可以作为一种良好的编码实践被省略,因为跳过它们会导致一些错误。为了使它更清楚,请考虑以下代码
if (userValue == "1")
message = "You won a new car!";
ReadLine();
相当于
if (userValue == "1")
{
message = "You won a new car!";
}
ReadLine();
每次ReadLine
执行的内容,无论userValue
值是多少。这可能不是开发人员的想法。
答案 2 :(得分:4)
但是如果您使用多行代码,则需要{}。
这并非严格属实。如果您有多个语句,则更准确,那么您需要使用{}
,而不是多个行。这是一个快速示例,其中包含许多行但不需要{}
if (...)
try {
Method();
} catch {
...
}
在此示例中,if
行后面的项目有很多行但不需要大括号。这是因为try
构造本身构成了单个语句。如果有多个语句需要作为if
的一部分执行,那么您可以使用{}
对它们进行分组。即使{}
可以包含多个语句,{}
构造本身也算作单个语句。
这条规则有两个值得注意的例外:标签和声明。两者都是语句,但在if (...)
语句后都不能直接使用。
答案 3 :(得分:3)
{}表示代码块。如果 if 为true,如果您要执行多个语句,则需要使用这些语句。
实施例: 没有{}这个块:
if (userValue == "1")
WriteLine ("You won a new car!");
ReadLine ();
无论userValue是否等于1,都会执行ReadLine()命令。
与花括号对比:
if (userValue == "1")
{
WriteLine ("You won a new car!");
ReadLine ();
}
现在,如果userValue不等于1,则跳过大括号内的两个命令,并继续执行}符号后的下一个语句。
答案 4 :(得分:1)
{}定义表达式的范围。在c#和其他几种语言中,他们可以简化表达式,如第一个例子。
答案 5 :(得分:1)
{}定义基于C
的语言中的执行范围,例如C ++,C#,Java。如果将{}添加到if语句,则定义将在该条件内执行的内容。
//1.both lines are surrounded by { }
if (userValue == "1")
{
//executes both lines when value is 1
WriteLine ("You won a new car!");
ReadLine ();
}
//2.No { } after the if statement
if (userValue == "1")
//executes only this one when value is 1 - it's scope is implied (see point 3.below)
WriteLine ("You won a new car!");
//this one always will get executed, as it is not in scope of the if statement
ReadLine ();
//3 - no {} means implied scope for one liner
if (userValue == "1")
message = "You won a new car!";
//and is equivalent to
if (userValue == "1")
{
message = "You won a new car!";
}
答案 6 :(得分:1)
你的第一个例子是C#提供快捷方式的方式。编译器处理
if (userValue == "1")
message = "You won a new car!";
和
if (userValue == "1")
{
message = "You won a new car!";
}
完全相同。
归结为个人偏好是否使用单行的速记;
一个常见的例子是从函数快速返回:
if (isValid = false)
return false;
当然没有正确或错误的方法,但我个人的宠儿就是当人们这样做时:
if (userValue == "1")
message = "You won a new car!";
else
message = "You won a hippopotamus!"
这是不好的形式(以我的拙见),即使它会编译。
重要的是,无论您决定编写单行内容,都要在代码中以某种方式保持一致。
答案 7 :(得分:1)
之间没有区别:
if (userValue == "1")
message = "You won a new car!";
和
if (userValue == "1")
{
message = "You won a new car!";
}
...除了风格。但是:
if (userValue == "1")
message = "You won a new car!";
GiveNewCar();
现在,你已经没钱了,因为每个人都买了一辆新车。如果没有作用域,只有if条件后面的语句才会被if语句绑定/保护。以下行不会。为了防止这种情况,您需要:
if (userValue == "1")
{
message = "You won a new car!";
GiveNewCar();
}
现在,只有那些应得的少数人才会得到一个。
这就是为什么人们经常建议总是包括范围括号,即使它们不是严格需要的 - 以防止在添加第二行代码时出现错误,并且突然间客户的车道充满了Fords。 / p>
答案 8 :(得分:1)
想象一下,如果你有
if (userValue == "1")
WriteLine ("You won a new car!");
ReadLine ();
在c#(和大多数语言)中,缩进没有任何区别(也就是'空白')
就C#而言,与
相同if (userValue == "1")
WriteLine ("You won a new car!");
ReadLine ();
这不是你想要的!因此你需要{}。单行有效,因为编译器可以在末尾看到分号
If you are interested in languages where {} are not used and indentation is used
look at python
答案 9 :(得分:0)
正如大家所提到的,它用于在C#中定义代码块,对于单行语句,无论你是否有大括号都没关系,但根据stylecop(用于强制执行一组样式和一致性规则)即使你的语句只是单行,也总是有花括号。
SA1503:CurlyBracketsMustNotBeOmitted :http://stylecop.soyuz5.com/SA1503.html