【问题标题】:Statements cannot exist outside of methods?语句不能存在于方法之外?
【发布时间】:2011-08-25 19:39:39
【问题描述】:

阅读一本书(VS 2010),它说 .NET Csharp 中的命令(语句)不能存在于方法之外。 我想知道 - 字段声明等,这些是命令,不是吗?它们存在于班级层面。有人可以详细说明一下吗?

【问题讨论】:

    标签: c# methods terminology


    【解决方案1】:

    如果你的意思是:

    class Foo
    {
        int count = 0;
        StringBuilder buffer = new StringBuilder();
    }
    

    计数和缓冲区是使用初始化器表达式的声明。但是这段代码不包含语句

    【讨论】:

      【解决方案2】:

      字段初始化器是用方法外部的代码编写的,但编译器将该代码放在构造函数中。

      所以像这样的字段初始化器:

      class Foo  {
      
        int Bar = 42;
      
      }
      

      基本上是构造函数中的一个字段和一个初始化器:

      class Foo  {
      
        int Bar;
      
        Foo() {
          Bar = 42;
        }
      
      }
      

      【讨论】:

        【解决方案3】:

        C# 中没有“命令”这样的概念。

        静态/实例变量声明不属于 C# 中的语句 - 它是一个 field-declaration(它是一种 class-member-declaration ) 根据 C# 规范。例如,参见C# 4 spec 的第 10.5 节。

        现在声明 local 变量的语句是声明,由规范中的 declaration-statement 定义(第 8.5 节)。不过,它们仅用于当地人。有关 C# 4 中语句产生式的完整列表,请参见 B.2.5 节。

        基本上,C# 规范定义了所涉及的术语 - 因此,尽管您可能非正式地想到“命令”等,但在正确性方面,C# 规范是权威的来源。 (当然,除了没有说明语言设计者的意思的地方。这种情况非常罕见。)

        【讨论】:

        • 那么带有初始化的声明呢?
        • @Miria:这仍然是 field-declaration 的一部分,但它不是声明。它可以使用 lambda 表达式,而后者又可以包含语句,请注意...
        • 谢谢!这让我很困惑,因为书上说 int A=5 是语句,所以你不能忘记写分号..
        • @Miria:当它在方法中时,它是一个语句(声明语句)。当它只是一个班级成员时,它不是一个声明。
        【解决方案4】:

        正如您所说,它们是声明,声明是实际完成某事的声明。

        【讨论】:

        • 好吧,一个声明并没有来保留内存——它可以包含一个初始化器,它也可以做一些事情。但它仍然不是一个声明。
        【解决方案5】:

        不,它们是声明。准确地说,是类成员声明。

        而且那些存在于方法之外的东西是完全合法的。否则,你一开始就不能声明一个方法!

        通过“语句”,这本书告诉你,你不能在方法之外有诸如方法调用之类的东西。例如下面的代码是非法的:

        public void DoSomething()
        {
            // Do something here...
        }
        
        MessageBox.Show("This statement is not allowed because it is outside a method.");
        

        【讨论】:

          【解决方案6】:

          类、命名空间、字段声明不是声明语句。

          一个字段可以在一个方法之外用一个表达式初始化,但是当一个表达式是一个语句时,有很多语句不是表达式(例如if)。

          这一切都归结为语言语法如何定义术语,以及 C# 的定义方式非常普遍(例如,与 C 和 C++ 非常相似)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-02
            • 2020-10-08
            • 1970-01-01
            • 2013-09-18
            • 1970-01-01
            • 1970-01-01
            • 2021-08-24
            • 2021-05-18
            相关资源
            最近更新 更多