C# 语句不能存在于方法之外?

C# 语句不能存在于方法之外?,c#,methods,terminology,C#,Methods,Terminology,阅读一本书(VS2010),它说.NETCSharp中的命令(语句)不能存在于方法之外。 我想知道-字段声明等,这些是命令,不是吗?它们存在于班级层面。有人能详细解释一下吗?正如你所说的,它们是声明,一个声明实际上完成了一些事情。不,它们是声明。准确地说,类成员声明 这些存在于一种方法之外是完全合法的。否则,您首先不能声明方法 通过“语句”,这本书告诉你,在一个方法之外不能有像方法调用这样的东西。例如,以下代码是非法的: public void DoSomething() { // Do

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

正如你所说的,它们是声明,一个声明实际上完成了一些事情。

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

这些存在于一种方法之外是完全合法的。否则,您首先不能声明方法

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

public void DoSomething()
{
    // Do something here...
}

MessageBox.Show("This statement is not allowed because it is outside a method.");

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

静态/实例变量声明在C#中不属于语句——根据C#规范,它是字段声明(类成员声明的一种类型)。例如,请参见第10.5节

现在,声明局部变量的语句是由规范中的声明语句(第8.5节)定义的语句。不过,它们只供当地人使用。有关C#4中语句生成的完整列表,请参见第B.2.5节


基本上,C#spec定义了所涉及的术语——因此,尽管您可能会非正式地想到“命令”之类的东西,但在正确性方面,C#spec是权威的来源。(当然,除了没有说明语言设计者的意图之外,这是非常罕见的。)

类、名称空间和字段声明不是声明

可以使用表达式在方法外部初始化字段,但当表达式是语句时,有许多语句不是表达式(例如,
if

这一切都归结于语言语法如何定义术语,以及C#的定义方式非常常见(例如,非常类似于C和C++)。

如果您的意思是:

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

计数和缓冲区是使用初始值设定项表达式的声明。但该代码不包含任何语句

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

这样的字段初始化器:

class Foo  {

  int Bar = 42;

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

class Foo  {

  int Bar;

  Foo() {
    Bar = 42;
  }

}

好吧,声明不必只保留内存——它可以包含一个初始化器,它也可以做一些事情。但它仍然不是一个语句。那么初始化的声明呢?@Miria:这仍然是字段声明的一部分,但它不是一个语句。它可以使用lambda表达式,而lambda表达式又可以包含语句,请注意……谢谢!书中说int A=5是一个语句,这让我很困惑,所以你千万不要忘记写分号。@Miria:当它与方法(声明语句)在一起时,它就是一个语句。当它只是一个类成员时,它不是一个语句。