想象一下这样的代码:
var str = (String)null;
是否与以下内容不同:
String str;
或者:
String str = null;
第一个代码是否导致装入空值,还是在编译时将其解析为字符串?
答案 0 :(得分:9)
String
是一个引用类型,所以不,没有拳击。
var str = (String)null;
String str = null;
这两个是等价的。在第一行中,编译器从表达式的右侧推断出str
的类型。在第二行中,从null
到string
的强制转换是隐含的。
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)
拳击是将值类型转换为类型对象
的过程
String
不是值类型,因此不会有装箱/拆箱。
是的,他们是平等的。因为即使你说string str
,字符串也是引用类型;它将获得默认值null
答案 3 :(得分:3)
这两个是平等的:
var str = (String)null;
String str = null;
然而,这一个,
String str;
取决于上下文可能或可能不等于先前的表达式。如果它是局部变量,则它不相等。您必须明确初始化它。如果它是一个类变量,那么它初始化为null。
既不会造成拳击。