2013-08-07 2 views
0

Рассмотрим меняКогда выполняются статические конструкторы до или после статических полей?

public class ClassA 
{ 
    public string PropertyB { get; set; } 
} 

А потом использовать его как этот

public class ClassD 
{ 
    static readonly ClassA PropertyE = new ClassA(); 

    static ClassD() 
    { 
      PropertyE.PropertyB = "valueF"; 
    } 
} 

, но остальная часть кода не работает, как я ожидал. Затем я переписал ClassD, и он работал

public class ClassD 
{ 
    static readonly ClassA PropertyE = new ClassA { PropertyB = "valueF" }; 
} 

Каким образом эти два примера кода отличаются? Я ожидал, что у них такое же поведение, но они этого не делают.

+1

Что именно не работает после того, как в первом примере? Может быть, причина здесь не найдена, а скорее результат чего-то, что вы оставили (за комментарий @ pswg) –

+0

@AustinSalonen исправлено –

+1

Вам нужно развернуть _, но остальная часть кода не работала так, как я ожидал, с акцентом на то, что вы ожидали (_I ожидал, что у них было такое же поведение, но они этого не делают). –

ответ

1

По MSDN:

Если класс содержит статические поля с инициализаторами, этих инициализаторы выполняются в текстовом порядке непосредственно перед выполнением статического конструктора.

Единственная разница между двумя классами заключается в том, как инициализируется PropertyE. Сначала сначала присваивается выборка, ClassD.PropertyE, затем ClassA.PropertyB. Во втором образце сначала назначается ClassA.PropertyB, затем ClassD.PropertyE. Это может производить несколько разные результаты.

У вас могут быть проблемы с круговыми зависимостями между полями. Как указано в статье MSDN:

Можно построить круговые зависимости, которые позволяют наблюдать статические поля с переменными инициализаторами в их состоянии по умолчанию.

using System; 
class A 
{ 
    public static int X; 
    static A() { 
     X = B.Y + 1; 
    } 
} 
class B 
{ 
    public static int Y = A.X + 1; 
    static B() {} 
    static void Main() { 
     Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y); 
    } 
} 

производит выходной

X = 1, Y = 2

+1

Если бы это было так, два образца кода имели бы такое же поведение, не так ли? –

+0

@JaderDias Можете ли вы объяснить, как они ведут себя по-другому? –

+0

Поведение было таким же, как если бы статический конструктор вообще не выполнялся. –

Смежные вопросы