码迷,mamicode.com
首页 > 其他好文 > 详细

Best Practice For Class Field Initialization

时间:2016-01-05 18:39:59      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

转载请保留此原文链接 http://www.cnblogs.com/LikeVirgo/p/5103308.html

正文

类的字段初始化参考下面的规则:

  1. 仅声明字段,让系统自动将其初始化为默认值。
  2. 非默认值的情况,优先选择variable initializer进行字段初始化。
  3. 使用带参数的构造函数,并在构造函数内完成字段初始化。

为什么要优先选择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

参考资料

  1. Best Practice: Initialize class fields in constructor or at declaration?
  2. Fields (C# Programming Guide)
  3. C# Language Specification

 

Best Practice For Class Field Initialization

标签:

原文地址:http://www.cnblogs.com/LikeVirgo/p/5103308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!