哪一条C#语句等价于以下内容:
int myInt = new int();
我在http://smarterer.com上发现了这个问题。smarterer.com网站提供了三个答案:
int myInt = NULL;
int myInt;
int myInt = 0;
我知道第一个命题是错误的。那另外两个人呢。我现在的问题是,int myInt;
和int myInt = 0;
之间有什么区别?对我来说是一样的。
发布于 2014-11-20 06:29:29
第二个语句取决于上下文。如果它是一个字段声明,那么它与赋值0没有什么不同,因为类型成员总是被初始化的。如果它是一个局部变量,那么第二条语句不会初始化该变量;在您使用它之前,需要对它进行初始化。
您不能将NULL
分配给int
类型的东西,所以很明显,第一个答案不是正确的。:)
我会选择第三个答案,因为它是最可靠的使用new int()
。
发布于 2014-11-20 06:35:43
int
是一个结构,所以当您在C#中定义一个int时,它从技术上被初始化为它的默认值(零)。但是,在字段上初始化值是最佳实践,因此您列出的三个选项中最等价的是第三个选项: int myInt = 0
不能将结构(值类型)分配给null
,因为它是不可空的类型。
有一些方法可以使用可空结构(Nullable<T>
),但这不是您想要的。
更新
由于我的帖子中有一些评论分享了不同的结果,所以我想,当你在delcaration上初始化值类型时,而不是当你需要它们时,我会详细阐述那些令人毛骨悚然的表现。
当优化构建( IL代码中没有nop
命令)时,如果将初始化设置为默认值,则不会看到初始化,这是测试代码:
class initfield
{
public int mynum = 0;
}
class noinitfield
{
public int mynum;
}
这是类的IL并调用它们(如果超出了问题范围,很抱歉):
初始化时:
.class private auto ansi beforefieldinit test.initfield
extends [mscorlib]System.Object
{
// Fields
.field public int32 mynum
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2087
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method initfield::.ctor
} // end of class test.initfield
没有初始化:
.class private auto ansi beforefieldinit test.noinitfield
extends [mscorlib]System.Object
{
// Fields
.field public int32 mynum
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x208f
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method noinitfield::.ctor
} // end of class test.noinitfield
现在,如果您将IL代码重新编译回初始化字段的类的C#中:
internal class initfield
{
public int mynum;
}
如您所见,编译器将冗余初始化优化为默认值。请注意,这只适用于基本类型,因此datetime不会被优化掉。-所以在这个问题上,int myInt;
和int myInt = 0;
完全一样。
发布于 2014-11-20 06:34:43
在C#中,数据类型的默认值由新操作符使用。int myint=new int();
语句具有与int myInt = 0;
相同的效果。
https://stackoverflow.com/questions/27033147
复制相似问题