我是一名正在学习 C# 的 C++ 程序员。我目前正在阅读 C#4.0 in a Nutshell。
我在第 74 页看到了这个声明/片段:
静态字段初始值设定项运行在
字段的顺序
宣布。下面的例子
说明了这一点:X 被初始化为
0 和 Y 初始化为 3。
class Foo
{
public static int X = Y; // 0
public static int Y = 3; // 3
}
我不明白如何在不首先声明 Y 的情况下为 X 分配 Y 中的值。我在这里错过了什么吗?
顺便说一句,来自 C++ 背景的我倾向于使用术语 ctor 来表示构造函数 - 然而,我还没有在 C# 中遇到过这个术语 - 术语 ctor 也在 C# 世界中使用吗?
[Edit]
同一页上的另一个例子(在前面提到的书中)是这样的:
class Program
{
static void Main() { Console.WriteLine (Foo.X); } // 3
}
class Foo
{
public static Foo Instance = new Foo();
public static int X = 3;
Foo() { Console.WriteLine (X); } // 0
}
书中指出(对于上面的例子):
该示例打印 0 后跟 3
因为字段初始值设定项
实例化一个 Foo 在 X 之前执行
初始化为3:
我对这些例子还有一些进一步的问题。
这两个示例都出现在标题为静态构造函数和字段初始化顺序然而,代码示例并没有显示静态构造函数 - 至少不是我可以轻松识别的静态构造函数。我期望静态构造函数与类具有相同的名称,无参数并且前面带有 'static' 关键字。所以我不明白这些示例与章节标题有何关系。我在这里缺少什么?
在第二个示例中,(非静态)构造函数打印出 X 的值 - 其中有明确地在上一行中被赋值为 3 - 但打印出来的输出却是 0。为什么?!
就内容而言,声明的顺序并不重要可用的这里。情况并不像这些local变量,变量只有在声明后才可用。对于实例变量和方法来说也是如此,其中在源中较早声明的方法可以调用在源中较晚声明的方法,等等。
但声明的顺序is就初始化程序的执行而言很重要,这就是您得到这种行为的原因。请注意,如果将这些变量更改为const
,两者都将取值 3 - 编译器将计算出所需的求值顺序,并检测是否存在任何循环(这会导致错误)。然后将计算常数compile-时间,以及直接嵌入IL中的值。
有关有效内容等的更多详细信息,请参阅规格.
至于术语 - 我通常不认为有必要将“constructor”缩写为“ctor”,尽管我认为它会被普遍理解。我可能会使用该缩写作为变量名,例如:
var ctor = typeof(...).GetConstructor(...);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)