【设计原则和建议】 字段
希望和大家分享和讨论字段的设计思想和原则,共同进步。
1.不要依赖字段的初始化顺序
class FieldDemo
{
private int id = 1;//通过某中方法获取Id的值
private ClassF f1 = new ClassF(1);//不要在这里依赖其他成员和执行顺序
public FieldDemo()
{
//在构造函数里面设置依赖关系和执行顺序
id = 1;
f1 = new ClassF(id);
}
}
public class ClassF
{
public ClassF(int id)
{
}
}
2.字段不应该是Public的
- const可以是public的,不过我个人不推荐使用const
3.声明字段的时候,显式赋值而不是依赖默认值
private int age = 0;
private string name = null;
private DateTime date = DateTime.MinValue;
public ClassF f = null;
4.命名规则,选择名词,名词词组或是形容词+名词
public class ClassF2
{
private int id = 0;//camel命名
private static int DefaultId = 0; //实例字段pascal命名
private int m_id = 0;//老式命名方法, 不推荐也不反对
private static int s_DefaultId = 0; //老式命名方法,不推荐也不反对
//如果是修改代码 要考虑现有代码的命名规则
}
5.如果可以,用以下方式调用字段
- 方便阅读和理解
public class ClassF
{
private int id = 0;
private static int defaultId = 0;
public ClassF(int id)
{
//只是测试代码
Console.WriteLine(id);//参数和本地变量 非常不推荐参数和本地变量与字段重名。。。
Console.WriteLine(this.id);//实例字段和成员加this
Console.WriteLine(ClassF.defaultId);//静态字段和成员加类名
}
}
6.如果可以,记得在Dispose中释放已经实现IDisposable接口的成员
public class ClassF3 : IDisposable
{
public FileStream newFile = null;
protected virtual void Dispose(bool disposing)
{
//true代表这个代码是用户调用的,回收托管和非托管资源
//false代表这个代码是CLR调用的,只回收非托管资源
if (disposing)
{
// 释放托管资源
newFile.Close();
}
// 释放非托管资源
}
//不要提供virtual关键字
//子类不要覆盖父类的实现
public void Dispose()
{
Dispose(true);
//由于我们使用Dispose回收了资源
//就要通知GC不要调用终结器再次回收该资源
GC.SuppressFinalize(this);
}
}
7. static readonly 和 const
- const明显性能更好
- 如果该成员一定要public,或者是可能直接和间接被第三方程序集引用,需要明白const是在编译时就把内容拷贝到目标位置
8.移除未使用的私有字段
部分内容引用自MSDN,FxCop 和其他第三方文章..
因为本人水平有限,如有遗漏或谬误,还请各位高手指正