order initializiation静态参数

时间:2011-01-24 11:13:42

标签: c# initialization declaration specifications

是否有关于初始化静态只读参数的顺序的规范?

在下面的例子中,可以确定,数组总是以6的长度创建吗?

public class Foo {
    private static readonly int MAX_STACKSIZE = 6; 
    private static readonly int[] m_stack = new int[MAX_STACKSIZE]; 
}

或者是否有机会在 MAX_STACKSIZE之前初始化m_stack?

@Edit:将 const 更改为静态只读

1 个答案:

答案 0 :(得分:6)

编辑:这个答案是在示例代码包含“const”而不是“static readonly”时编写的。它对于当前版本的问题无效 - 我可能会在某个时候写下另一个答案,但我现在没有时间。

无论如何,这都不是有效的C#,因为你不能将const int[]设置为除null以外的任何其他内容。

但是,在更一般的情况下,C#规范的第10.4节适用:

  

只要依赖关系不是循环性的,就允许常量依赖于同一程序中的其他常量。编译器会自动安排以适当的顺序评估常量声明。

然后给出以下示例:

class A
{
    public const int X = B.Z + 1;
    public const int Y = 10;
}

class B
{
    public const int Z = A.Y + 1;
}

并说......

  

编译器首先计算A.Y,然后计算B.Z,最后计算A.X,按顺序生成值10,11和12。