C#变量初始化问题

cos*_*son 14 c# initialization default-value

我是否初始化整数变量是否有任何区别:

int i = 0;
int i;
Run Code Online (Sandbox Code Playgroud)

编译器或CLR是否将此视为同一事物?IIRC,我认为他们都被视为同一件事,但我似乎无法找到这篇文章.

Mic*_*odd 14

如果变量i是实例变量,则会自动为其赋值0.如果它是方法中的局部变量,则它是未定义的,因此您需要在使用它之前为其赋值.

例如:

class Program
{
    static void Main(string[] args)
    {
        intTest it;

        it = new intTest();

        Console.ReadLine();
    }

    class intTest
    {
        int i;

        public intTest()
        {
            int i2;

            Console.WriteLine("i = " + i);
            Console.WriteLine("i2 = " + i2);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以上将无法编译,因为i2未分配.但是,通过将0分配给i2,即

int i2 = 0;
Run Code Online (Sandbox Code Playgroud)

并编译,然后运行,将显示两者现在分配为0.


The*_*ean 7

我查看了IL(使用ildasm),并确认只有int设置为0才能在构造函数中设置为0.

public class Class1
{
    int setToZero = 0;
    int notSet;
}
Run Code Online (Sandbox Code Playgroud)

产生:

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       15 (0xf)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.0
  IL_0002:  stfld      int32 ClassLibrary1.Class1::setToZero
  IL_0007:  ldarg.0
  IL_0008:  call       instance void [mscorlib]System.Object::.ctor()
  IL_000d:  nop
  IL_000e:  ret
} // end of method Class1::.ctor
Run Code Online (Sandbox Code Playgroud)

  • Michael:字段由_memory manager_初始化为默认值(零),而不是_constructor_. (9认同)