Does C# resolve dependencies among static data members automatically?

1.1k views Asked by At

If one static data member depends on another static data member, does C#/.NET guarantee the depended static member is initialized before the dependent member?

For example, we have one class like:

class Foo
{
    public static string a = "abc";

    public static string b = Foo.a + "def";
}

When Foo.b is accessed, is it always "abcdef" or can be "def"?

If this is not guaranteed, is there any better way to make sure depended member initialized first?

2

There are 2 answers

0
Bryan Menard On BEST ANSWER

Like said before, static field initialization is deterministic and goes according to the textual declaration ordering.

Take this, for example:

class Foo
{
    public static string b = a + "def";
    public static string a = "abc";
}

Foo.b will always result in "def".

For that matter, when there is a dependency between static fields, it is better to use a static initializer :

class Foo
{
    public static string b;
    public static string a;

    static Foo()
    {
        a = "abc";
        b = a + "def";
    }
}

That way, you explicitly express your concern about the initialization order; or dependency for that matter (even if the compiler won't help if you accidentally swap the initialization statements.) The above will have the expected values stored in a and b (respectively "abc" and "abcdef").

However, things might get twisty (and implementation specific) for the initialization of static fields defined in multiple classes. The section 10.4.5.1 Static field initialization of the language specification talks about it some more.

1
Oliver Friedrich On

It will show allways "abcdef", because initialization goes top down in source, today just like before.

All static members will be initialized upon loading of the classtype holding them.