我无法找到答案的问题:当实例化我的课程时,实例化成员的顺序是什么。
例如,我可以将成员设置为声明顺序中较低的成员吗? (请参见代码示例。)
// Can I do the following:
class foo
{
int A = B;
int B = 12;
}
// And this, for class types:
class bar
{
foo X = Y;
foo Y = new foo();
}
答案 0 :(得分:1)
在这种情况下,字段实例化的顺序无关紧要。重要的是,您不能在字段初始化器中使用非静态字段,方法或属性。因此,无论您做什么都没关系:
class Foo
{
int A = B;
int B = 12;
}
或相反的顺序
class Foo
{
int B = 12;
int A = B;
}
您的代码无论如何都不会编译。您将收到A field initialize cannot reference the non-static field, method, or property 'Foo.B'
错误。
因此,您不必担心订单,因为这种情况永远不会发生。
答案 1 :(得分:1)
你只是做不到。
您将收到以下编译错误:
错误CS0236 字段初始化程序无法引用非静态字段,方法或属性“ Program.foo.A”测试C:\ Users \ sebas \ source \ repos \ Test \ Test \ Program.cs 14有效
我将问题扩展到静态字段,它们从第一个执行到最后一个。
可以使用以下代码轻松对其进行测试:
class foo
{
public static int A = foo.B;
public static int B = 3;
public static int C = foo.B;
}
static void Main(string[] args)
{
Console.WriteLine(foo.A);
Console.WriteLine(foo.B);
Console.WriteLine(foo.C);
Console.ReadLine();
}
结果将是:
0
3
3
无论如何。即使工作正常,我还是建议您只使用构造函数。您将获得可维护性。
答案 2 :(得分:1)
尽管有一个糟糕的例子,但值得了解初始化的实际工作方式。 C#6.0规范草案对此有这样的说明:
字段初始化中描述的默认值初始化适用于所有字段,包括具有变量初始化程序的字段。因此,当初始化一个类时,该类中的所有静态字段都首先被初始化为其默认值,然后按文本顺序执行静态字段初始化程序。同样,在创建类的实例时,该实例中的所有实例字段都首先被初始化为其默认值,然后以文本顺序执行该实例字段初始化器。