Приводит ли null к string бокс?

Представьте себе код такой:

var str = (String)null;

Отличается ли это от:

String str;

Или же:

String str = null;

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

4 ответа

Решение

Давайте разберем ваш вопрос и разобьем его на части.

Будет ли код в вашем вопросе вызывать бокс?

Нет, не будет.

Это не потому, что какой-либо из 3 операторов работает по-разному (хотя есть различия, подробнее ниже), но бокс - это не концепция, которая возникает при использовании строк.

Упаковка происходит, когда вы берете тип значения и заключаете его в объект. string является ссылочным типом, и поэтому с ним никогда не будет связан бокс.

Итак, бокс вышел, а как насчет остальных, равны ли три утверждения?

Эти двое будут делать то же самое:

var str = (String)null;
String str = null;

Третий (второй в порядке вашего вопроса) отличается в том смысле, что он только объявляет str идентификатор типа String, он специально не инициализирует его null,

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

Если, с другой стороны, это локальная переменная, теперь у вас есть неинициализированная переменная. Судя по тому что ты пишешь var ..., что является недопустимым с точки зрения полей, это, вероятно, более правильно для вашего вопроса.

String это ссылочный тип, так что нет, там нет бокса.

var str = (String)null;
String str = null;

Эти два эквивалентны. В первой строке компилятор выводит тип str с правой стороны выражения. Во второй строке приведен null в string неявно.

String str;

Последний эквивалентен String str = null если это объявление поля, что означает str будет назначено его значение по умолчанию, которое является нулевым. Если, однако, str это локальная переменная, она должна быть явно назначена, прежде чем вы сможете ее использовать.

MSDN говорит,

Бокс - это процесс преобразования типа значения в объект типа

String не является типом значения и поэтому не будет никакого бокса / распаковки.

Да, они равны. Так как строка является ссылочным типом, даже если вы говорите string str; он получит значение по умолчанию, которое null

Эти два равны:

var str = (String)null;
String str = null;

Тем не менее, этот,

String str;

В зависимости от контекста может быть или не быть равным предыдущим выражениям. Если это локальная переменная, то она не равна. Вы должны явно инициализировать это. Если это переменная класса, то она инициализируется нулем.

Не вызывает бокс.

Другие вопросы по тегам