Почему ссылочные типы не инициализируются к пустому указателю?

Проверьте этот код..

    string str;

    if (str.Contains("something.."))
    {
    }

Компилятор бросает эту ошибку для этого кода

Использование неназначенной локальной переменной 'ул.'

То, почему делает ссылочный тип, не инициализируется к пустому указателю?

Просто хочу знать из любопытства.

Я также хотел бы знать то, что происходит для кода ниже. как это присвоение работает?

    string str = null;
9
задан dandan78 12 December 2012 в 16:00
поделиться

4 ответа

Он инициализирует нулевым значением. Компилятор только что оказал вам услугу, так как ему не пришлось отлаживать неизбежное исключение NullReferenceException, которое вы получите.

2
ответ дан 4 December 2019 в 07:23
поделиться

Имейте в виду, что вызов Contains на нулевой строке вызовет NullReferenceException.

-1
ответ дан 4 December 2019 в 07:23
поделиться

Язык C # требует, чтобы все переменные были однозначно присвоены до их чтения. Локальные переменные считаются изначально неназначенными , тогда как поля, элементы массива и так далее считаются , изначально присвоенными их значению по умолчанию . (Что для ссылочного типа имеет значение null.)

Нет технической причины, по которой мы не могли бы рассматривать локальные переменные как изначально присвоенные их значениям по умолчанию и отбрасывать всю проверку определенного присваивания. Это связано с тем, что использование неназначенного локального значения в качестве значения по умолчанию является (1) плохой практикой кодирования и (2) весьма вероятным источником раздражающих ошибок. Требуя от вас явного назначения локальных переменных перед их использованием, мы предотвращаем использование пользователем плохой практики и устраняем целый класс ошибок, которые вам никогда не придется отлаживать.

Также примите во внимание следующее:

while(whatever)
{
    int i;
    print(i);
    i = i + 1;
}

Ожидаете ли вы, что i будет сохранять свое значение во время выполнения цикла или каждый раз будет инициализироваться новым нулевым значением? Заставляя вас явно инициализировать его, вопрос становится бессмысленным, и это разница, которая не имеет значения.

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

Я не знаю, как ответить на ваш второй вопрос, потому что я не знаю, что вы имеете в виду под словом «работа». Можете ли вы сказать мне, как присвоить "int x = 123;" работает? Как только я пойму, что вы имеете в виду под словом «работает», я смогу описать, как работает присвоение значения null переменной ссылочного типа.

7
ответ дан 4 December 2019 в 07:23
поделиться

Только поля (переменные, объявленные на уровне класса), инициализируются автоматически:

  • Типы значений инициализируются по значению по умолчанию.
  • Типы ссылок инициализируются на NULL .

То, что вы объявляете, - это «локальная переменная» внутри способа. Локальные переменные не инициализируются автоматически независимо от того, чтобы быть типа значений или типом ссылочного типа.

Я также хотел бы знать, что происходит для кода ниже. Как работает это задание?

Это назначение инициализирует локальную переменную с нулевым значением с инструкцией LDNULL , за которым следует инструкция STLOC (в случае, если он не оптимизирован, конечно) И более важно, удовлетворяет правилам анализа потока данных компилятора для определенного назначения. Спецификация C # определяет концепцию, называемую определенным заданием, что обеспечивает переменную, назначенную перед первым использованием.

22
ответ дан 4 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: