Порядок инициализации данных класса
От: Аноним  
Дата: 19.10.08 17:44
Оценка:
1. Переменная х получит значение 10 раньше, чем вызовется конструктор. Память под переменную о выделится раньше, чем вызовется конструктор. Верно ли это? Может ли быть ситуация, что в момент вызова конструктора(внутри самого конструктора) переменные х и о будут неинициализированными ?

class A
{
    int x = 10;

    object o = new object();

    public A()
    {
    }
}


2. Есть ли в стандарте описание(правило), в каком порядке инициализируются(инстанцируются?) данные класса? То есть сначала х, затем о, затем s ?

class A
{
    int x = 10;

    object o = new object();

    public A()
    {
    }

    string s = "hello";
}
Re: Порядок инициализации данных класса
От: MxKazan Португалия  
Дата: 19.10.08 18:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. Переменная х получит значение 10 раньше, чем вызовется конструктор. Память под переменную о выделится раньше, чем вызовется конструктор. Верно ли это? Может ли быть ситуация, что в момент вызова конструктора(внутри самого конструктора) переменные х и о будут неинициализированными ?


А>2. Есть ли в стандарте описание(правило), в каком порядке инициализируются(инстанцируются?) данные класса? То есть сначала х, затем о, затем s ?


Ну, насколько я понимаю, инициализация inplace на самом деле лишь как инструкция компилятору, запихнуть это дело в конструктор.

Т.е. следующий код:
class A
{
    int x = 10;

    object o = new object();

    public A()
    {
    }
}


будет преобразован компилятором C# в:
class A
{
    int x;

    object o;

    public A()
    {
        this.x = 10;
        this.o = new object();
    }
}


И логично, что компилер разместит инициализацию в порядке, в которой она встречается в коде.
Тоже самое и про статические поля, просто их инициализация размещается в статическом конструкторе.
Re: Порядок инициализации данных класса
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 19.10.08 18:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. Переменная х получит значение 10 раньше, чем вызовется конструктор. Память под переменную о выделится раньше, чем вызовется конструктор. Верно ли это? Может ли быть ситуация, что в момент вызова конструктора(внутри самого конструктора) переменные х и о будут неинициализированными ?


10.5.4 Field initialization
The initial value of a field, whether it be a static field or an instance field, is the default value (§5.2) of the field‘s type. It is not possible to observe the value of a field before this default initialization has occurred, and a field is thus never "uninitialized".


А>2. Есть ли в стандарте описание(правило), в каком порядке инициализируются(инстанцируются?) данные класса? То есть сначала х, затем о, затем s ?


10.5.5.2 Instance field initialization
The instance field variable initializers of a class correspond to a sequence of assignments that are executed immediately upon entry to any one of the instance constructors (§10.11.1) of that class. The variable initializers are executed in the textual order in which they appear in the class declaration. The class instance creation and initialization process is described further in §10.11.


10.11.2 Instance variable initializers
When an instance constructor has no constructor initializer, or it has a constructor initializer of the form base(...), that constructor implicitly performs the initializations specified by the variable-initializers of the instance fields declared in its class. This corresponds to a sequence of assignments that are executed immediately upon entry to the constructor and before the implicit invocation of the direct base class constructor. The variable initializers are executed in the textual order in which they appear in the class declaration.

Re: Порядок инициализации данных класса
От: Dr_Sh0ck Беларусь  
Дата: 21.10.08 08:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. Переменная х получит значение 10 раньше, чем вызовется конструктор. Память под переменную о выделится раньше, чем вызовется конструктор. Верно ли это?


[skipped]

Память под переменную выделяется в рамках выделения памяти под объект. Конструктор объекта вызывается когда память уже выделена.
Do not fake yourself ;)
ICQ#: 198114726
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.