将null转换为字符串会导致装箱吗?

时间:2014-11-27 10:43:37

标签: c# boxing

想象一下这样的代码:

var str = (String)null;

是否与以下内容不同:

String str;

或者:

String str = null;

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

4 个答案:

答案 0 :(得分:9)

String是一个引用类型,所以不,没有拳击。

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

这两个是等价的。在第一行中,编译器从表达式的右侧推断出str的类型。在第二行中,从nullstring的强制转换是隐含的。

String str;

最后一个等同于String str = null 如果它是一个字段声明,这意味着str将被赋予其默认值,即null。但是,如果str是一个局部变量,则必须先明确指定它才能使用它。

答案 1 :(得分:8)

让我们把你的问题拿走吧。

你问题中的代码会导致拳击吗?

不,它不会。

这不是因为3个语句中的任何一个都以不同的方式运行(虽然存在差异,更多信息如下),但拳击不是使用字符串时出现的概念。

当您使用值类型并将其包装到对象时,会发生拳击。 string引用类型,因此永远不会涉及拳击。

所以拳击已经结束,剩下的就是这三个陈述相等吗?

这两个也会这样做:

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

第三个(虽然你的问题顺序中的第二个)是不同的,因为它只声明str标识符为String类型,它没有专门将其初始化为null

但是,如果这是一个类的字段声明,这将是相同的,因为在构造对象时所有字段都被初始化为默认值/零,因此它实际上将被初始化为无论如何null

另一方面,如果这是一个局部变量,那么现在有一个未初始化的变量。从您编写var ...这一事实来看,这在字段方面是非法的,这可能对您的问题更为正确。

答案 2 :(得分:4)

MSDN说,

  

拳击是将值类型转换为类型对象

的过程

String不是值类型,因此不会有装箱/拆箱。

是的,他们是平等的。因为即使你说string str,字符串也是引用类型;它将获得默认值null

答案 3 :(得分:3)

这两个是平等的:

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

然而,这一个,

String str;

取决于上下文可能或可能不等于先前的表达式。如果它是局部变量,则它不相等。您必须明确初始化它。如果它是一个类变量,那么它初始化为null。

既不会造成拳击。