C#允许双分号; ; 如果是的话,有什么特别的方法吗?

我正在编写一个语句并编译,但编译器[VS]从未告诉我,我将分号放了两次。

这意味着在ASP.NET MVC 3中

return Json(mydata);; return Json(mydata); 

他们都编译,但第一个是错误的设计模式。 为什么不告诉我这两个分号。

如果没有理由使用两个分号,为什么不显示错误?

如果有特殊用途,请告诉我在C#中写一个语句需要两个分号的位置。

不,从不需要双分号。 我有点惊讶于编译器没有抱怨它是一个无法访问的语句,但显然它是合法的。 它不会造成任何伤害,但同样也不是一个好主意。

空语句在所有C派生语言中都有效。 最常见的习惯用法是在for语句中,例如:

 for (; ; ) { } 

如果它们是特殊用途,那么告诉我在c#中写一个语句需要两个分号的位置

在上面的例子中,当然需要两个分号。

那个双倍;; 是允许的,是出于历史原因。 这是C风格语言(C#所基于的)的宿醉。

C&C ++具有预处理器宏的概念,在编译代码之前代码中替换它们,例如,简单的例子AddAndSquare是一个宏,而不是一个函数

 #define AddAndSquare(X,Y) (X+Y)*(X+Y) int Foo() { int a = 1, b = 2; return AddAndSquare(a, b); } 

转到编译器

 int Foo() { int a = 1, b = 2; return (A+B)*(A+B); } 

您可以将宏重新定义为与其初始定义不同,也可以重新定义它们以使它们根本不存在。

给定一个断言宏#define ASSERT(c) if(!c) throw new AssertionFailedException()你可以使用ASSERT语句填充你的代码。

 void Foo(int x) { int y = x + 2; ASSERT(y != 0); int z = x / y; . . . . } 

现在考虑你只想在调试版本中使用断言,而不是在发布版本中,为了释放你将宏重新定义为空(字面意思是#define ASSERT )。 现在,当Foo转到编译器进行发布构建时,它看起来像这样

 void Foo(int x) { int y = x + 2; ; int z = x / y; . . . . } 

现在有一个空语句,其中ASSERT是,因为那里可能有也可能没有语句(取决于构建配置),编译器需要能够处理空语句。

为什么这个约定保存在C#里,没有像C宏这样的东西,我不知道,但可能是因为它几乎没有造成伤害。

我猜多了; 在开始解析代码之前,编译器会将其删除,因此无法访问; 被编译器忽略。

“无理由使用它们”和“无效使用它们”之间存在差异。 当语言无害时,为什么语言会浪费时间和精力来禁止你这样做呢?

; – 语句分隔符。 双分号包含空语句 ,它不执行任何操作。

使用空语句:

 while (Method()) ; 

要么

 void F() { //... if (done) goto exit; //... exit: ; } 

如您所见,此行为是正确的。 但在您的示例中,您将使用空语句无法访问代码。

目前没有特别的理由写出双分号。 据我所知,Visual Studio只会抱怨可能导致不需要的行为的分号,如下面的代码段:

 if (true) ; 

由于分号是一个空指令,整个if子句变得无用。 Visual Studio抱怨所有这样的构造(using,for,foreach等),没有括号。

所以以下代码适用于VS:

  if (true) { ; } 

C#编译器不允许;; if and else之间没有大括号和编译器会在下面的情况下抛出错误。

 if (condition == true) ; ; else ; 

编译器错误:

 Error CS1513 } expected and one warning "Possible mistaken empty statement" 

因此,如果你删除一个semicolon ,它将完美地工作(或者你需要添加大括号)。