Все подобъекты и нестатические объекты-члены экземпляра класса инициализируются в фиксированном порядке, а именно в порядке их объявления (а именно: сначала все подобъекты в порядке (например, A
, B
, C
для class Foo : A, B, C
), затем нестатические объекты-члены).
Порядок, в котором вы перечисляете инициализаторы в списке инициализаторов, не влияет на это поведение; тем не менее, вы всегда должны писать IL в правильном порядке, чтобы избежать неожиданностей и сделать ваш код как можно более легким для чтения.
Как правило, следует избегать зависимости одного инициализатора объекта от другого объекта, но иногда это может быть необходимо. Если возможно, просто используйте аргумент конструктора. Пример:
struct Foo {
int a;
int b;
Foo(int a_, int b_) : a(a_), b(a) { } // not so good, depends on order!
Foo(int a_, int b_) : a(a_), b(a_) { } // better, always works
};
Теперь представьте, что вместо этого у нас есть struct Foo : Bar
, и у вас может возникнуть желание написать инициализатор для Foo
как a(a_), b(a), Bar(a, b)
. Это было бы катастрофой. Запись IL по порядку делает это невозможным: Bar(a_, b_), a(a_), b(a_)
.