C#变量初始化问题

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

int i = 0; int i; 

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

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

 public class Class1 { int setToZero = 0; int notSet; } 

产生:

 .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 

如果变量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); } } } 

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

 int i2 = 0; 

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

是的,它几乎是一回事。

你可以参考这篇关于Coding Horror的文章

如下面的链接所述,它们完全相同:

http://msdn.microsoft.com/en-us/library/aa664742%28VS.71%29.aspx

在所有这些谈话中,值得一提的是C#中的“default”关键字。

就是int i; 等价于int i = default(int); 这相当于int i = 0;MyClass o = default(MyClass); 相当于MyClass o = null;

当使用linq方法(如.SingleOrDefault()时,这尤其重要,因为您始终可以使用以下方法使代码更具可读性:

 int someValue = collection..SingleOrDefault(); if (someValue == default(int)) { //Code for the default case } 

 MyClass someValue = collection..SingleOrDefault(); if (someValue == default(MyClass)) { //Code for the default case } 

无论何时在C#中创建类型,它都会自动填充填充的零。 在类(引用类型)的情况下,这相当于空指针。 因此,从技术上讲,每当您使用类时,以下内容都是相同的:

 MyClass class; MyClass class2 = null; 

使用值类型(任何结构,包括int / float / double / etc),类型以零传递,因此以下是等效的:

 int i; int j = 0; 

但是,在方法中,编译器会在使用之前检查您是否为类型指定了值。 如果您执行以下操作,编译器将抱怨:

 int i; Console.WriteLine{"{0}",i); 

从技术上讲,上面应该没问题 – 但由于它是程序员错误的常见来源,编译器专门检查未分配的局部变量,并抱怨。 但是,这是一个编译时投诉,而不是CLR问题。 你可以使IL执行上述操作,并且运行正常。

这些仅对于字段(类变量)是等效的。 初始化类时,会自动为字段分配默认值。 在方法或属性中,未分配的变量保持未分配状态,如果您尝试访问它的值,将导致编译器错误。

这里的各种回应都有误导性,包括“编码恐怖”网站中引用的文章。

当配置为优化生成的代码时,编译器将优化您的代码以删除所有“不必要的”初始化。 请注意,这是在“发布”模式下编译时的默认行为。

我认为,初始化所有变量总是非常有用。 在调试模式下性能命中率最低,在发布模式下没有任何性能,但显然设置变量的收益对于将来维护代码的人来说将是巨大的,在更好的“带代码的文档代码”样式中。 我记得我非常有经验的同事认为Int32的默认值是Int32.MinValue而不是0.这些类型的混淆总是发生在代码中的含义中,对我来说,在大多数情况下应该避免它们。