{}在C#中做了什么

时间:2014-01-11 01:37:02

标签: c# curly-braces

这是一个非常简单的问题,但在我向前推进之前我想知道这个问题,所以我理解这个过程。

在我关注的教程中,我使用的是if语句。如果您执行以下代码,则无需使用{}

if (userValue == "1")
    message = "You won a new car!"; 

但是如果您使用多行代码,则需要{}。

if (userValue == "1")
{
    WriteLine ("You won a new car!");
    ReadLine ();
}

有人可以用非常简单的术语向我解释为什么会这样吗?我只需要一个经验法则,这样我就可以理解为什么。没有什么过于复杂我只是一个初学者。我知道他们识别了一段代码,但我不确定为什么这会在一两行之间产生差异?

10 个答案:

答案 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