“int myInt;”和“int myInt = 0;”有什么区别?
本文关键字:myInt int 区别 什么 | 更新日期: 2023-09-27 18:31:20
哪个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 没有什么不同,因为类型成员总是初始化的。如果它是局部变量,则第二条语句不会初始化该变量;在使用它之前,稍后需要对其进行初始化。
你不能NULL
分配给int
类型的东西,所以显然第一个答案不是正确的。 :)
我会选择第三个答案,因为它最可靠,就像使用new int()
一样。
int
是一个结构体,因此当您在 C# 中定义 int 时,它在技术上被初始化为默认值(零)。但是,最佳做法是初始化字段上的值,因此您列出的三个选项中最等效的是第三个选项:int myInt = 0
不能将结构(值类型)分配给null
因为它是不可为空的类型。
有一些方法可以拥有可为空的结构(Nullable<T>
),但这不是你要问的。
默认值上的 MSDN
更新:
由于我的帖子有一些评论者分享了混合的结果,我想我会详细说明当你在 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;
}
如您所见,编译器将冗余初始化优化为默认值。请注意,这仅适用于基元类型,因此日期时间不会优化。- 所以在提出的问题的情况下,int myInt;
和int myInt = 0;
是完全相同的。
在 C# 中,数据类型的默认值由 new 运算符使用。 int myint=new int();
语句具有与int myInt = 0;
相同的效果
见 http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx