Best Practice For Class Field Initialization

转载请保留此原文链接 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
时间: 2024-10-13 05:35:21

Best Practice For Class Field Initialization的相关文章

Best Practice For Class Property Initialization

转载请保留此原文链接 http://www.cnblogs.com/LikeVirgo/p/5126929.html 属性初始化的最佳实践 属性的初始化 初始化属性跟初始化字段大体是一样的.通常情况下,我们都是基于字段来实现属性,所以为字段设置好初始值就等同于为属性也设置好了. 1 namespace PropertyInitialization 2 { 3 class User 4 { 5 private string name = ""; 6 7 public string Nam

口腔微生物总述

单词 oral candidosis 口腔念珠菌病 endowed赐予 deleterious有害的 pulmonarydisease肺病 diabetes mellitus糖尿病 feats 本领 Helicobacter pylori 幽门螺旋菌 mucus 粘 NoticeKnowledge and best practice in this field are constantly changing. As new research and experience broaden our

口腔微生物学家Oral Microbiology

网址 http://www.journaloforalmicrobiology.net/index.php/jom 1.Philip D. Marsh Oral Microbiology at Leeds Dental Institute, United Kingdom Philip Marsh is Professor of Oral Microbiology at Leeds Dental Institute, UK, and is Programme Leader for the TB &

一月二十日星期二

收获甚微的一天:没有敲多少代码也没看很多的书.时间败给了意志不坚定玩游戏去了.吃完晚饭看了些集合部分的知识.发现很多是关于数据结构的,但是自己已经忘得差不多了.先继续按着目前的计划走下去.以前总是热衷于收集资料和方法,其实最好的就是拿着一本书开始看.写了个前几天看到的动态初始化的构造demo.继续看公开课准备早点睡觉了 /* * Explicit Field Initialization */ public class Initialization { int x = getx(); publi

Android 内存剖析 – 发现潜在问题

简介 移动平台上的开发和内存管理紧密相关.尽管随着科技的进步,现今移动设备上的内存大小已经达到了低端桌面设备的水平,但是现今开发的应用程序对内存的需求也在同步增长.主要问题出在设备的屏幕尺寸上-分辨率越高需要的内存越多.熟悉Android平台的开发人员一般都知道垃圾回收器并不能彻底杜绝内存泄露问题,对于大型应用而言,内存泄露对性能产生的影响是难以估量的,因此开发人员必须要有内存分析的能力.本文介绍一些有用的工具,以及如何使用它们来检测这些关键的内存泄露问题. 工具 有很多工具可以用来帮助检测内存

马士兵hibernate(原始笔记)

马士兵hibernate(原始笔记) 课程内容 1        HelloWorld a)   Xml b)   annotation 2        Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping 3        常见的0/R框架(了解) 4        hibernate基础配置(重点) 5        ID生成策略(重点 AUTO) 6        Hibernate核心开发接口介绍(重点) 7        对象的三种状态(了

class随笔(三)

编写并改进类 目标:编写两个类,Person--(创建并处理关于人员信息的一个类)和Manage--(一个定制的Person,修改了继承的行为) 步骤1:创建实例,模块使用小写字母开头,类名使用大写字母开头. # Add record field initialization class Person: def __init__(self, name, job, pay): # 构造函数拥有三个参数 self.name = name # 创建构造函数时填入各个参数 self.job = job

hibernate入门知识

课程内容 1        HelloWorld a)   Xml b)   annotation 2        Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping 3        常见的0/R框架(了解) 4        hibernate基础配置(重点) 5        ID生成策略(重点 AUTO) 6        Hibernate核心开发接口介绍(重点) 7        对象的三种状态(了解) 8        关系映射(重点

PatentTips - Object-oriented processor architecture and operating method

BACKGROUND OF THE INVENTION The present invention relates to processors and computer systems. More specifically, the present invention relates to an object-oriented processor architecture and operating method. A conventional central processing unit (