Приводит ли 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;
В зависимости от контекста может быть или не быть равным предыдущим выражениям. Если это локальная переменная, то она не равна. Вы должны явно инициализировать это. Если это переменная класса, то она инициализируется нулем.
Не вызывает бокс.