Проверьте этот код..
string str;
if (str.Contains("something.."))
{
}
Компилятор бросает эту ошибку для этого кода
Использование неназначенной локальной переменной 'ул.'
То, почему делает ссылочный тип, не инициализируется к пустому указателю?
Просто хочу знать из любопытства.
Я также хотел бы знать то, что происходит для кода ниже. как это присвоение работает?
string str = null;
Он инициализирует нулевым значением. Компилятор только что оказал вам услугу, так как ему не пришлось отлаживать неизбежное исключение NullReferenceException, которое вы получите.
Имейте в виду, что вызов Contains на нулевой строке вызовет NullReferenceException.
Язык C # требует, чтобы все переменные были однозначно присвоены до их чтения. Локальные переменные считаются изначально неназначенными , тогда как поля, элементы массива и так далее считаются , изначально присвоенными их значению по умолчанию . (Что для ссылочного типа имеет значение null.)
Нет технической причины, по которой мы не могли бы рассматривать локальные переменные как изначально присвоенные их значениям по умолчанию и отбрасывать всю проверку определенного присваивания. Это связано с тем, что использование неназначенного локального значения в качестве значения по умолчанию является (1) плохой практикой кодирования и (2) весьма вероятным источником раздражающих ошибок. Требуя от вас явного назначения локальных переменных перед их использованием, мы предотвращаем использование пользователем плохой практики и устраняем целый класс ошибок, которые вам никогда не придется отлаживать.
Также примите во внимание следующее:
while(whatever)
{
int i;
print(i);
i = i + 1;
}
Ожидаете ли вы, что i будет сохранять свое значение во время выполнения цикла или каждый раз будет инициализироваться новым нулевым значением? Заставляя вас явно инициализировать его, вопрос становится бессмысленным, и это разница, которая не имеет значения.
(Кроме того, в приведенном выше случае существует небольшая потенциальная оптимизация производительности, поскольку компилятор может повторно использовать переменную без необходимости генерировать код для очистки ее содержимого, поскольку компилятор знает, что вы будете очистите содержимое.)
Я не знаю, как ответить на ваш второй вопрос, потому что я не знаю, что вы имеете в виду под словом «работа». Можете ли вы сказать мне, как присвоить "int x = 123;" работает? Как только я пойму, что вы имеете в виду под словом «работает», я смогу описать, как работает присвоение значения null переменной ссылочного типа.
Только поля (переменные, объявленные на уровне класса), инициализируются автоматически:
NULL
. То, что вы объявляете, - это «локальная переменная» внутри способа. Локальные переменные не инициализируются автоматически независимо от того, чтобы быть типа значений или типом ссылочного типа.
Я также хотел бы знать, что происходит для кода ниже. Как работает это задание?
Это назначение инициализирует локальную переменную с нулевым значением с инструкцией LDNULL
, за которым следует инструкция STLOC
(в случае, если он не оптимизирован, конечно) И более важно, удовлетворяет правилам анализа потока данных компилятора для определенного назначения. Спецификация C # определяет концепцию, называемую определенным заданием, что обеспечивает переменную, назначенную перед первым использованием.