将 null 转换为字符串是否会导致装箱
本文关键字:是否 null 转换 字符串 | 更新日期: 2023-09-27 18:32:09
>想象一下这样的代码:
var str = (String)null;
它与以下不同吗:
String str;
或:
String str = null;
第一个代码是否会导致空值装箱,还是在编译器时将其解析为字符串?
String
是引用类型,所以不,没有装箱。
var str = (String)null;
String str = null;
这两者是等价的。在第一行中,编译器从表达式的右侧推断str
的类型。在第二行中,从null
到string
的演员阵容是隐含的。
String str;
最后一个等效于 String str = null
如果它是一个字段声明,这意味着str
将被分配其默认值,即 null。但是,如果str
是局部变量,则必须先显式分配它,然后才能使用它。
让我们把你的问题拆开
。您问题中的代码会导致装箱吗?
不,不会。
这并不是因为 3 个语句中的任何一个操作不同(尽管存在差异,更多内容见下文),但装箱不是使用字符串时出现的概念。
当您采用值类型并将其包装到对象中时,就会发生装箱。string
是一种引用类型,因此永远不会涉及装箱。
所以拳击出局了,剩下的呢,三句话相等吗?
这两个将执行相同的操作:
var str = (String)null;
String str = null;
第三个(尽管按您问题的顺序排列的第二个)是不同的,因为它仅声明str
标识符为String
类型,它没有专门将其初始化为null
。
但是,如果这是一个类的字段声明,这将是相同的,因为在构造对象时,所有字段都初始化为默认值/零,因此无论如何它实际上都会初始化为null
。
另一方面,如果这是一个局部变量,则您现在有一个未初始化的变量。从你写var ...
的事实来看,这在领域方面是非法的,这对你的问题来说可能更正确。
MSDN说,
装箱是将值类型转换为类型对象的过程
String
不是值类型,因此不会有装箱/取消装箱。
他们是平等的。由于字符串是引用类型,即使您说string str
;它将获得默认值,即null
这两者是相等的:
var str = (String)null;
String str = null;
然而,这个,
String str;
根据上下文,可能等于也可能不等于以前的表达式。如果它是一个局部变量,那么它就不相等。您必须显式初始化它。如果它是一个类变量,则将其初始化为 null。
两者都不会导致拳击。