“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;有什么区别?对我来说是一样的。

“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