是THEN还是END如果大致相当于花括号

时间:2013-04-03 13:46:02

标签: c# vb.net if-statement language-comparisons

当编译器看到THEN...END IF(在Vb中)和{ ... }(在C#中)时,它们会看到相同的东西,它们似乎是分隔If语句。

如果以相同的方式对待它们,为什么我可以在C#中执行此操作:

if(true)
 int x = 1;

//Instead of

if(true)
{ 
 int x = 1;
}

但不是在VB中:

//Won't Compile

if(true)
x As Integer = 1

//Instead Of

if(true) then
x As Integer = 1
End If

5 个答案:

答案 0 :(得分:7)

C#和VB.NET是两种不同的语言,具有不同的语法规则。一种语言中的规则与另一种语言中的类似规则之间没有一对一的映射。

THEN和END IF 语义与if语句的花括号相同(即它们的含义相同),但VB.NET语法不允许省略它们。< / p> BTW:你的样本相当糟糕,因为在特殊情况下,即使在C#中你也不能省略花括号。

答案 1 :(得分:5)

C#和vb.net在解析语句时有不同的规则。 VB.net派生自QuickBasic,它源自Microsoft BASIC解释器,其中带有错误条件的IF / THEN语句将导致解释器跳到行结束或ELSE语句(以先发生者为准)。因为将所有语句都置于与该语句相同的行上的IF语句中有点烦人,QuickBasic的设计使得如果一行包含IF / THEN,ELSEIF / THEN或ELSE但没有其他语句,执行将跳到下一个相应的ELSEIF,ELSE或ENDIF。

虽然VB语法有点特别,但实际上它的效果非常好。在两种语言中可能都不错的一件事是一个声明,其明确定义的目的是开始一个变量范围块。在vb.net中,可以说:

If True Then ' Scoping block
  Dim SB As New System.Text.StringBuilder()
  ...
End If

但这似乎有点icky。在C#中为此目的单独使用大括号的能力可能会被视为该语言的“胜利”,但是如果没有评论,那么在阅读代码时,大括号的目的是作为变量作用域时,不会很清楚阻止,而不是将某些应该被有条件地或重复地执行的语句分组,而不是出于任何原因“丢失”它们的控制语句。

答案 2 :(得分:2)

它们不等效,因为VB中的“语句结束”分隔符是一行的结尾。 VB中的等价物是:

Dim x As Integer
If True Then x = 1

顺便说一下,为了让你的C#示例更正确,它应该是:

int x = 0;
if (true)
    x = 1;

请注意,我只回答你关于等效语法eps的问题,而不是判断编码风格,因为其他答案中提到的原因,你绝对不应该这样做。

答案 3 :(得分:2)

C#中的语法是

if (conditional)
    statement
else
    statement

语句可以是以分号结尾的单行代码,也可以是一组包含多个语句的括号。

请注意,这也完全有效:

if (conditional)
{
    {
        {
            CallMyFunction();
            CallMyOtherFunction();
        }
    }
}

就if而言,它下面有一个声明,最外面的花括号。额外的大括号与if语句的性质无关,在语句中,语句内,语句中只有两个语句......

答案 4 :(得分:0)

这就是语言的设计方式。有许多人不喜欢在单行if语句中排除大括号的自由,因为它为初学者提供了难以发现的错误的可能性:

if(p.Birthday == DateTime.Today)
    SendBirthdayCard();

如果你(看似无情)将其修改为:

if(p.Birthday == DateTime.Today)
    Console.WriteLine("Happy Birthday!!");
    SendBirthdayCard();

突然所有人获得生日卡!!