【設計原則和建議】 字段
希望和大家分享和討論字段的設計思想和原則,共同進步。
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 和其他第三方文章..
因為本人水平有限,如有遺漏或謬誤,還請各位高手指正
浙公網安備 33010602011771號