Инициализация переменных C # против присвоения - PullRequest
1 голос
/ 23 сентября 2010

В книге я нашел следующее (перевод):

Инициализация означает присвоение значения переменной во время объявления.int X=5 называется командой инициализации.

РЕДАКТИРОВАТЬ: он просто говорит, что термин инициализация используется только тогда, когда вы присваиваете значение во время объявления.Если вы сделаете это позже, это просто назначение (согласно ему - я так не думаю, и поэтому я спрашиваю).Это правда или нет?

Ну, я всегда думал (и, по мнению других пользователей в сети) об инициализации в терминах первого присваивания значения переменной.Я думаю, что int X=5 - это просто присвоение как часть декларации.

Я безуспешно пытался искать в MSDN.Спасибо за любую информацию.

Ответы [ 4 ]

5 голосов
/ 23 сентября 2010

Если все, о чем вы спрашиваете, это терминология (* которая не совсем понятна из вашего вопроса), «Инициализация» переменной - это буквально первый раз, когда ей присваивается значение. Этот термин происходит от того факта, что вы присваиваете переменной «начальное» значение.

Это должно (очевидно) произойти до того, как оно будет использовано в первый раз.

int x=5;

- это объявление и инициализация, и это действительно просто удобное сокращение для

int x;
x=5;
3 голосов
/ 23 сентября 2010

Обычно инициализация переменной - это первое присваивание после объявления, поскольку переменные не инициализируются автоматически.Последующие присваивания - это просто присваивания.

void foo() {
    int i;//not initialized.
}

За исключением полей , которые являются переменными, объявленными в классе или структуре.Они инициализируются их значениями по умолчанию непосредственно перед вызовом конструктора для этого экземпляра объекта.Следовательно, даже если вы (сначала) присваиваете что-то полю в конструкторе, и это поле не было инициализировано при объявлении, это, строго говоря, присваивание, а не инициализация.Не вдаваясь в такие подробности, я предполагаю, что многие программисты рассматривают первое назначение поля в конструкторе как инициализацию и могут использовать его как таковой в своих разговорах друг с другом.Вероятно, это использование / привычка проистекает из использования неуправляемых языков, таких как C / C ++, где переменная содержит тарабарщину при первом объявлении, и, следовательно, они должны заполнить ее не мусорными значениями (инициализация).

class A {
    int x;//not initialized
    int y = 1;//initialized here
    A() {
        x = 1;//strictly speaking, not initialization, just assignment.
        y = 2;//was obviously initialized above
    }
}

Для программистов, не пишущих компиляторы или языки, способность эффективно общаться с другими программистами важнее, чем знание точной терминологии инициализации слова.Так что продолжайте и используйте это в значении, которое все вокруг вас понимают.Вы не ошибетесь, если объясните точное значение (но я, вероятно, не буду опасаться разоблачения моих педантичных тенденций).

Лично я избегу книги, которая использует термин «команда инициализации» для переменных.

0 голосов
/ 24 сентября 2010

Обратите внимание, что инициализация полей заставляет компилятор C # выдавать инструкции инициализации IL для каждого конструктора .Таким образом, если у вас есть несколько конструкторов, у вас будет дублирование инициализирующего IL - то есть ненужного раздувания кода.

Лучше инициализировать переменные в конструкторе по умолчанию и заставить другие конструкторы вызывать его.

0 голосов
/ 23 сентября 2010

Как правило, инициализация, если переменная присваивается в первый раз, явно программой или неявно компилятором / средой выполнения.Однако механизмы инициализации важно понимать, особенно при работе с классами.Попробуйте пройти простой пример ниже (где-нибудь создать экземпляр Bar), чтобы увидеть, как компилятор выполняет процесс инициализации.Вы заметите, что поля объявлены с инициализацией, и все они «инициализированы» до того, как конструкторы смогут установить их.

...