我最近一直在用C#和Java编程,我很好奇最好的地方是初始化我的类字段.
我应该在申报时做到吗?:
public class Dice { private int topFace = 1; private Random myRand = new Random(); public void Roll() { // ...... } }
或者在构造函数中?:
public class Dice { private int topFace; private Random myRand; public Dice() { topFace = 1; myRand = new Random(); } public void Roll() { // ..... } }
我真的很好奇你们有些人认为最好的做法.我想保持一致并坚持一种方法.
我的规则:
使用默认值在声明中没有初始化(null
,false
,0
,0.0
...).
如果您没有更改字段值的构造函数参数,则首选声明中的初始化.
如果由于构造函数参数而改变字段的值,则将初始化放在构造函数中.
在你的实践中保持一致(最重要的规则).
在C#中没关系.您提供的两个代码示例完全相同.在第一个例子中,C#编译器(或它是CLR?)将构造一个空构造函数并初始化变量,就像它们在构造函数中一样.如果已有构造函数,则"上方"的任何初始化将被移动到其顶部.
就最佳实践而言,前者比后者更不容易出错,因为有人可能很容易添加另一个构造函数并忘记链接它.
C#的语义与Java略有不同.在C#中,声明中的赋值是在调用超类构造函数之前执行的.在Java中,它立即完成,允许使用'this'(对匿名内部类特别有用),并且意味着两个表单的语义确实匹配.
如果可以,请将字段设为最终字段.
我认为有一点需要注意.我曾经犯过这样一个错误:在派生类中,我试图"初始化声明"从抽象基类继承的字段.结果是存在两组字段,一组是"base",另一组是新声明的字段,调试花了我一些时间.
教训:要初始化继承的字段,你可以在构造函数中完成.
假设您的示例中的类型,肯定更喜欢初始化构造函数中的字段.特殊情况是:
静态类/方法中的字段
输入的字段为static/final/et al
我总是将类顶部的字段列表视为目录(此处包含的内容,而不是如何使用),以及构造函数作为简介.方法当然是章节.