哪个C#语句等同于此:
int myInt = new int();
我在http://smarterer.com找到了这个问题。 smarterer.com网站建议3个答案:
int myInt = NULL;
int myInt;
int myInt = 0;
我知道第一个命题是不正确的。但是另外两个呢。我现在的问题是int myInt;
和int myInt = 0;
之间有什么区别?对我来说也是如此。
答案 0 :(得分:9)
第二个陈述取决于背景。如果它是一个字段声明,那么它与指定0没有区别,因为类型成员总是被初始化。如果它是局部变量,那么第二个语句不会初始化变量;在您使用它之前需要对它进行初始化。
您无法将NULL
分配给int
类型的内容,因此第一个答案显然不是正确答案。 :)
我会选择第三个答案,因为它最可靠地使用new int()
。
答案 1 :(得分:1)
int
是一个结构,所以当你在C#中定义一个int时,它在技术上被初始化为它的默认值(零)。但是,最佳做法是初始化字段上的值,以便您列出的三个选项中最相同的是第三个:int myInt = 0
您不能将结构(值类型)分配给null
,因为它是非可空类型。
有多种方法可以使用可为空的结构(Nullable<T>
),但这不是你要问的。
<强>更新强>:
由于我的帖子中有一些共享混合结果的评论者,我想我会在您进行有关退出时的值类型而不是在需要时初始化值时详细说明所遇到的效果。
优化构建时(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;
}
如您所见,编译器将冗余初始化优化为默认值。请注意,这仅适用于基本类型,因此日期时间不会被优化掉。 - 因此,对于提出的问题,int myInt;
和int myInt = 0;
完全相同。
答案 2 :(得分:0)
在C#中,数据类型的默认值由new运算符使用。
int myint=new int();
语句与int myInt = 0;