Разница между строкой 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 (который сам гарантирует инициализацию) как неинициализированную переменную.