【发布时间】:2011-08-25 19:39:39
【问题描述】:
阅读一本书(VS 2010),它说 .NET Csharp 中的命令(语句)不能存在于方法之外。 我想知道 - 字段声明等,这些是命令,不是吗?它们存在于班级层面。有人可以详细说明一下吗?
【问题讨论】:
标签: c# methods terminology
阅读一本书(VS 2010),它说 .NET Csharp 中的命令(语句)不能存在于方法之外。 我想知道 - 字段声明等,这些是命令,不是吗?它们存在于班级层面。有人可以详细说明一下吗?
【问题讨论】:
标签: c# methods terminology
如果你的意思是:
class Foo
{
int count = 0;
StringBuilder buffer = new StringBuilder();
}
计数和缓冲区是使用初始化器表达式的声明。但是这段代码不包含语句。
【讨论】:
字段初始化器是用方法外部的代码编写的,但编译器将该代码放在构造函数中。
所以像这样的字段初始化器:
class Foo {
int Bar = 42;
}
基本上是构造函数中的一个字段和一个初始化器:
class Foo {
int Bar;
Foo() {
Bar = 42;
}
}
【讨论】:
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# 规范是权威的来源。 (当然,除了没有说明语言设计者的意思的地方。这种情况非常罕见。)
【讨论】:
正如您所说,它们是声明,声明是实际完成某事的声明。
【讨论】:
不,它们是声明。准确地说,是类成员声明。
而且那些存在于方法之外的东西是完全合法的。否则,你一开始就不能声明一个方法!
通过“语句”,这本书告诉你,你不能在方法之外有诸如方法调用之类的东西。例如下面的代码是非法的:
public void DoSomething()
{
// Do something here...
}
MessageBox.Show("This statement is not allowed because it is outside a method.");
【讨论】:
类、命名空间、字段声明不是声明语句。
一个字段可以在一个方法之外用一个表达式初始化,但是当一个表达式是一个语句时,有很多语句不是表达式(例如if)。
这一切都归结为语言语法如何定义术语,以及 C# 的定义方式非常普遍(例如,与 C 和 C++ 非常相似)。
【讨论】: