Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does C# resolve dependencies among static data members automatically?

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?

like image 660
Morgan Cheng Avatar asked Nov 13 '09 05:11

Morgan Cheng


1 Answers

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.

like image 120
Bryan Menard Avatar answered Nov 05 '22 02:11

Bryan Menard