转载请保留此原文链接 http://www.cnblogs.com/LikeVirgo/p/5103308.html
正文
类的字段初始化参考下面的规则:
- 仅声明字段,让系统自动将其初始化为默认值。
- 非默认值的情况,优先选择variable initializer进行字段初始化。
- 使用带参数的构造函数,并在构造函数内完成字段初始化。
为什么要优先选择variable initializer(规则2)?
不论字段是否设置了variable initializer,在类初始化的时候,所有的字段都会先初始化为默认值,然后再执行variable initializer,接着才是构造函数……
如果我们有多个构造函数,使用variable initializer可以避免遗漏字段初始化的情况。
系统自动初始化的默认值够好吗(规则1)?
出于兼容性的考虑,微软不会轻易修改各种类型的默认值设定。
如果为了这个而使用variable initializer为所有的字段赋一个默认值,那么除了要多敲几行代码以外,你可能还会损失一部分性能。
实际上,variable initializer是C#提供的语法糖,编译器会将它的代码内联到构造函数中。
1 namespace FieldInitialization 2 { 3 class User 4 { 5 private string name = ""; 6 7 public User(string name) 8 { 9 this.name = name; 10 } 11 } 12 }
1 .method public hidebysig specialname rtspecialname 2 instance void .ctor(string name) cil managed 3 { 4 // Code size 25 (0x19) 5 .maxstack 8 6 IL_0000: ldarg.0 7 IL_0001: ldstr "" 8 IL_0006: stfld string FieldInitialization.User::name 9 IL_000b: ldarg.0 10 IL_000c: call instance void [mscorlib]System.Object::.ctor() 11 IL_0011: ldarg.0 12 IL_0012: ldarg.1 13 IL_0013: stfld string FieldInitialization.User::name 14 IL_0018: ret 15 } // end of method User::.ctor
参考资料
- Best Practice: Initialize class fields in constructor or at declaration?
- Fields (C# Programming Guide)
- C# Language Specification
时间: 2024-10-13 05:35:21