0

当编译器看到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
4

5 回答 5

7

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

THEN 和 END IF 在语义上与 if 语句的花括号相同(即它们的含义相同),但 VB.NET 语法不允许省略它们。

顺便说一句:您的示例相当糟糕,因为在这种特殊情况下,即使在 C# 中,您也不能省略花括号。

于 2013-04-03T13:47:41.340 回答
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

但这似乎有点恶心。在 C# 中为此目的单独使用大括号的能力可能被视为该语言的“胜利”,但如果没有注释,则在阅读代码时不清楚大括号的目的是用作变量范围块,而不是将一些本应有条件或重复执行的语句分组,但由于某种原因“丢失”了它们的控制语句。

于 2013-04-03T13:57:19.383 回答
2

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

Dim x As Integer
If True Then x = 1

顺便说一句,为了使您的 C# 示例更正确,它实际上应该是:

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

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

于 2013-04-03T13:50:02.720 回答
2

C# 中的语法是

if (conditional)
    statement
else
    statement

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

请注意,这也是完全有效的:

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

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

于 2013-04-03T14:06:23.847 回答
0

这就是语言的设计方式。有很多人讨厌在单行if语句中排除大括号的自由,因为它为新手打开了难以发现的错误的可能性:

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

如果您(看似无害)将其修改为:

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

突然每个人都收到一张生日贺卡!!

于 2013-04-03T13:48:33.713 回答