将 null 转换为字符串是否会导致装箱

本文关键字:是否 null 转换 字符串 | 更新日期: 2023-09-27 18:32:09

>想象一下这样的代码:

var str = (String)null;

它与以下不同吗:

String str;

或:

String str = null;

第一个代码是否会导致空值装箱,还是在编译器时将其解析为字符串?

将 null 转换为字符串是否会导致装箱

String

引用类型,所以不,没有装箱。

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

这两者是等价的。在第一行中,编译器从表达式的右侧推断str的类型。在第二行中,从nullstring的演员阵容是隐含的。

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。

两者都不会导致拳击。