【问题标题】:What does it mean to have a block inside my method?在我的方法中有一个块是什么意思?
【发布时间】:2019-07-06 22:31:17
【问题描述】:

我之前有以下代码:

 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 条件的行,但忘记删除块。现在,这个块在这里意味着什么。每次我想要的时候它都会执行,但是为什么编译时它没有给出任何错误?

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

任何信息都会很有帮助。

【问题讨论】:

  • 您正在创建一个范围。
  • 但是变量是在块外声明的。那么它将如何改变范围?无论我在块内分配给i 的任何值在块外都可用。
  • 它不会给您错误或警告,原因与您在表达式中添加多余的括号不会给您错误相同的原因。正如其他人所说,它确实引入了一个额外的范围,但除此之外,为什么应该关心你是否给它((((1+4))))而不是1+4

标签: c# .net


【解决方案1】:

为什么编译时没有报错?

这里有什么术语/概念吗?

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

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

所以说真的,你熟悉的 if 语句和 while 语句只需要在它们的 header 后面加上一个语句,并且由于在任何允许单个语句的地方都允许一个块,所以你可以在那里写一个块。

并且这些没有任何标题的块与任何其他块一样工作。他们创建了一个新的范围。块内声明的变量不能在块外访问。

【讨论】:

    【解决方案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.
            }               
        }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 2013-11-02
      • 2013-03-29
      • 2013-01-30
      • 1970-01-01
      相关资源
      最近更新 更多