为什么C#允许这个有趣? ; ; ; ;

时间:2013-12-12 18:58:37

标签: c# syntax

请参阅我的以下代码

protected void Page_Load(object sender, EventArgs e)
{
    ExistsOnPath("efsui.exe"); ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
    install(); ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
}

我在visual studio中添加了更多的分号符号。为什么visual studio允许这个?这是错的还是正确的?

看到此图片和红色标记。构建成功

enter image description here

但错误显示在这一行?

webClient.DownloadFile("http://www.who.int/inf-new/dnldtxt/introductions.zip", "";;;;;;;;;;;;;;;;);

enter image description here

另一个有趣的是,下面的一行是成功的

private void install()
    {
        http://www.stackoverflow.com
        return;
    }

3 个答案:

答案 0 :(得分:10)

因为分号;是有效的空语句

8.3 The empty statement

  

空语句什么都不做。

     

空语句:

     

     

当没有要执行的操作时,使用空语句   需要声明的上下文。

     

执行空语句只是将控制转移到结尾   声明的重点。因此,空语句的结束点是   如果可以访问空语句,则可以访问。

另见:Statements (C# Programming Guide) - MSDN

  

空语句由单个分号组成。它什么都不做   并且可以在需要声明但没有动作的地方使用   需要进行。

编辑:

webClient.DownloadFile("http://www.who.int/inf-new/dnldtxt/introductions.zip", ;;;;;;;;;;;;;;;;"");
  

但为什么错误显示在这一行?

; 分号是一个有效的空语句,但这并不意味着您可以将其放在代码中的任何位置。 DownloadFile方法需要两个参数,你可以在其中放置任何语句,如:

webClient.DownloadFile("http://www.who.int/inf-new/dnldtxt/introductions.zip",
                                             Console.Write("Some Text");,  "");

其中Console.Write本身就是一个有效的语句,但它不能用于参数。

  

为什么这段代码会编译:

private void install()
{
    http://www.stackoverflow.com
    return;
}

因为它将http:视为Labeled statements,并且冒号后的任何内容都被视为标签文本的一部分。上面的代码会产生警告

  

此标签尚未引用

答案 1 :(得分:3)

;可以用作C#语言中的空语句。因此,连续多个;就好了,因为它只是一系列空语句。基本上是无操作

请注意,这不是Visual Studio行为,而是C#语言行为。与VB.Net等其他语言相同的代码会产生编译错误

答案 2 :(得分:2)

成功,因为以分号结尾的每个语句都没有任何语法错误;他们是空的。现在,就生成的代码而言,不会为这些语句生成任何内容。

为了更好地理解它,你可能想研究解析器的工作原理。