Разница между строкой str и строкой str = null
Я хочу знать, что именно происходит внутри, когда мы объявляем переменную, например:
string tr;
string tr = null;
Во время отладки я заметил, что для обоих значений он отображает только нуль. Но при использовании ref tr
без инициализации null
он выдаст ошибку, а вторая строка не будет.
Пожалуйста, помогите мне подробно узнать об этом
Ответы
Ответ 1
Во время отладки я заметил для обоих значений, что он показывает нулевое значение только
Это верно, потому что string
является ссылочным типом, а значение по умолчанию для всех типов ссылок - null
.
Но компилятор С# не позволяет использовать неинициализированные переменные.
Ваш первый пример - это просто объявление переменной. Но второй - это переменная инициализация.
Вот почему, если вы пишете;
string tr;
Console.WriteLine(tr);
вы получаете ошибку компилятора, например:
Использование неназначенной локальной переменной 'tr'
Из ref (C# Reference)
Аргумент, передаваемый параметру ref , должен быть инициализирован прежде чем он пройдет.
Хотя переменные, переданные как out
arguments, не должны быть инициализированы перед передачей.
Ответ 2
Ваш первый оператор - это просто объявление, а ваш второй оператор - декларация + Инициализация.
string tr; // Just Declaration
string tr=null; //Declaration + Initialization.
Вы можете получить ошибки времени компиляции, если попытаетесь использовать tr
только с объявлением. (первый случай), например:
string tr; // Just Declaration
if (tr == "") //Use of unassigned local variable
{
}
Такая же ошибка генерируется для ключевого слова ref
, которое требует, чтобы поле было явно присвоено что-то (Декларация + Инициализация). С ключевым словом out
вы можете использовать только объявление, но метод будет отвечать за то, чтобы удостовериться, что какое-то значение назначено параметру out
.
Ответ 3
Компилятор требует, чтобы вы явно задали значение null
(или любое другое) для переменной. Он не хочет никаких недоразумений и меньше ошибок времени выполнения в вашей программе, поэтому он осторожно указывает, что вы не можете инициализировать переменную перед ее использованием.
Исключением является использование метода с параметром out
(который сам гарантирует инициализацию) как неинициализированную переменную.