【设计原则和建议】 字段

希望和大家分享和讨论字段的设计思想和原则,共同进步。
 

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 和其他第三方文章..

因为本人水平有限,如有遗漏或谬误,还请各位高手指正

posted on 2011-10-16 11:31  听说读写  阅读(1483)  评论(4编辑  收藏  举报

导航