实例化顺序

时间:2019-07-31 17:51:03

标签: c#

我无法找到答案的问题:当实例化我的课程时,实例化成员的顺序是什么。

例如,我可以将成员设置为声明顺序中较低的成员吗? (请参见代码示例。)

// 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();
}

3 个答案:

答案 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规范草案对此有这样的说明:

  

字段初始化中描述的默认值初始化适用于所有字段,包括具有变量初始化程序的字段。因此,当初始化一个类时,该类中的所有静态字段都首先被初始化为其默认值,然后按文本顺序执行静态字段初始化程序。同样,在创建类的实例时,该实例中的所有实例字段都首先被初始化为其默认值,然后以文本顺序执行该实例字段初始化器。

来源:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#field-initialization