在我的方法中包含一个块是什么意思?

时间:2019-02-13 06:58:01

标签: c# .net

我以前有以下代码:

 public class Program
    {

        public static void Main(string[] args)
        {
              int i = 0;
           while(condition)
           {
             .........
             .........
            if (condition)           
            {
                i = 6;
                Console.WriteLine("Inside Block :" +i);
            }
           else
            {
            i = 7;
            Console.WriteLine("After block : " + i);
            }
          }
        }               
    }

后来,我发现我不需要任何条件,并且希望每次将6分配给变量i。所以我注释掉了代码,但是这样做却犯了一个愚蠢的错误,所以现在我的代码如下:

公共课程         {

        public static void Main(string[] args)
        {
              int i = 0;
           while(condition)
           {
             .........
             .........
           // a block without condition                    
            {
                i = 6;
                Console.WriteLine("Inside Block :" +i);
            }

          }
        }               
    }

如您所见,错误地我只是注释掉/删除了具有if条件的行,却忘了删除这些块。现在,这个块在这里意味着什么。无论如何,它每次都会执行,但是为什么编译时没有给出任何错误?

我们在这里有任何术语/概念吗?我知道Initializer Block中的Java,但这不是这里发生的情况。在Multi-Threading环境中,它的工作方式是否会有所不同?

任何信息都会很有帮助。

2 个答案:

答案 0 :(得分:2)

  

为什么编译时没有给出任何错误?

     

我们在这里有任何术语/概念吗?

因为C#允许您这样做。 C#语言规范第1.5节:

  

一个块允许在允许单个语句的上下文中编写多个语句。块由在定界符{}之间编写的语句列表组成。

实际上,您熟悉的if语句和while语句仅需在其标题之后添加一个语句,并且由于在允许单个语句的地方都允许使用块,因此您可以在此处编写一个块。

这些没有任何标题的块的工作原理与其他任何块一样。他们创建了一个新的范围。在该块中声明的变量无法在该块外部访问。

答案 1 :(得分:2)

基本上,当您放置{}块(也称为作用域)时,它定义了代码执行的边界。

public static void Main(string[] args)
        {
              int i = 0;
           while(condition)
           {
             .........
             .........
           // a block without condition                    
            {
                i = 6;
                Console.WriteLine("Inside Block :" +i);
            }

          }
        }               
    }

由于变量i是在方法级别定义的,因此对您的代码没有太大影响。

假设您在该范围内定义了一个变量,然后尝试在外部访问该变量,这将产生错误,因为在范围内定义的任何变量都限制了范围的边界。

例如。

public static void Main(string[] args)
        {
              int i = 0;
           while(condition)
           {
             .........
             .........
           // a block without condition                    
            {
                int j = 44;
                i = 6;
                Console.WriteLine("Inside Block :" +i);
            }

          }
          Console.WriteLine(j); // <------------------ This would generate error.
        }               
    }