C#、數據庫編碼規範講解

C#語言編程規範

遵循一定的編程規範,即有利於工程建設、團隊合作,也是每個程序員的自身素質的體現。本文結合研發羣實際工作情況,篩選了部分重要的、易實現的規範

1.1 命名規範

1.1.1 標識符命名

  1. 標識符的命名應當符合“min-length && max-information”(最小長度&最大信息量)原則。
  2. 標識符要採用常用英文單詞或其組合,便於記憶和閱讀,儘量避免使用漢語拼音來命名,推薦採用應用領域相關的術語來命名。
  3. 標識符只能由26個英文字母,10個數字,及下劃線的一個子集來組成,並嚴格禁止使用連續的下劃線(不易分辨),下劃線也不能出現在標識符頭或結尾(預編譯開關和利用工具生成的代碼除外);數字也不能出現在標識符的頭部。
  4. 常量名都要使用大寫字母, 用下劃線 ‘_’ 分割單詞。
  5. 程序中不要出現僅靠大小寫區分的相似的標識符。
推薦 不推薦
string strName; string strOtherName;
string strname; string STRNAME;
  1. 一般變量名不得取單個字符(如i、j、k等)作爲變量名,局部循環變量除外。
  2. 儘量避免名字中出現數字編號,如Value1、Value2等,除非邏輯上的確需要編號。

1.1.2 類、方法命名

  1. 類名採用大小寫結合的方法,構成類名的每個單詞的首字母的首字母也必須大寫。在構成類名的單詞之間不用下劃線。
  2. 接口命名在名字前加上“I”前綴,其它和類命名規範相同。
  3. 類方法的局部變量命名採用Camel規範或匈牙利規範。
  4. 方法名用大寫字母開頭的單詞組合而成,且應當使用“動詞”或者“動詞+名詞”(動賓詞組)。

1.1.3 控件命名

  1. 控件命名應採用完整的英文描述符命名,名字的前綴是控件類型名縮寫,符合匈牙利命名規範。
推薦 不推薦
Lable控件 lblName Lable控件 Name
Button控件 btnSave Button控件Save
TextBox控件 txtName TextBox控件 Name
DataGrid控件 gridList DataGrid控件 list1

1.2 代碼佈局

  1. 源代碼文件(.cs)的佈局順序是:using語句、命名空間、類。
  2. if、else、else if、for、while、do等語句自佔一行,執行語句不得緊跟其後。不論執行語句有多少都要加 { }。
//推薦
if (iCount < 100) 
{
    iCount = 500;
} 
//不推薦
if (iCount < 100) iCount = 500; 
  1. 禁止使用TAB鍵,必須使用空格進行縮進。縮進爲4個空格。
  2. 程序的分界符‘{’和‘}’應獨佔一行並且位於同一列,同時與引用它們的語句左對齊。{ }之內的代碼塊使用縮進規則對齊。
    推薦 不推薦
//推薦
void  Function(int intVar)
{  // 獨佔一行並與引用語句左對齊。
    while (condition)
    {
        DoSomething() // 與{ }縮進4格
    }
} 
//不推薦
void Function(int intVar){
while (condition){
DoSomething();
}}

5.不同邏輯程序塊之間要使用空行分隔。

//推薦
void Hey(void)
{
    [Hey實現代碼]
}
    // 空一行
void Ack(void)
{
    [Ack實現代碼]
}	

//不推薦
void Hey(void)
{
    [Hey實現代碼]
}
void Ack(void)
{
    [Ack實現代碼]
}
// 兩個函數的實現是兩個邏輯程序塊,應該用空行加以分隔。

6.前臺ASPX頁面中標籤必須規整對應,保存之前利用VS格式化工具格式化。

1.3 表達式和語句

  1. 在表達式中使用括號,使表達式的運算順序更清晰。
if (((intYear % 4 == 0) && (intYear % 100 != 0))||(intYear % 400 == 0))                                	
if (intYear % 4 == 0 && intYear % 100 != 0 || intYear % 400 == 0)

2.避免表達式中的附加功能,不要編寫太複雜的複合表達式
3.在switch語句中,每一個case分支必須使用break結尾,最後一個分支必須是default分支。
正確 錯誤

switch (iMessage)
{
    case SPAN_ON:
        [處理語句]
        break;
    case SPAN_OFF:
        [處理語句]
        break;
    default:
        [處理語句]
        break;
}                                	
switch (iMessage)
{
    case SPAN_ON:
        [處理語句]
        break;
    case SPAN_OFF:
        [處理語句]

     default:
        [處理語句]
        break;
}                                

4.寫在C#中的SQL語句,對於關鍵字要求全部大寫,每個主要的 SQL 子句放在不同的行上。
5.循環嵌套次數不推薦大於3次。

1.4 業務代碼規範

1.4.1 適量註釋

一般情況下,源程序有效註釋量必須在20%以上,尤其對個性化且功能較複雜的代碼要有關鍵性的註釋,註釋語言必須準確、易懂、簡潔。

1.4.2 變量初始化

值類型變量(int、struct)定義時要初始化值,引用類型變量(string、class)定義時,能初始化值的儘量初始化。
####1.4.3 字符串拼接
由於字符串本身就是一個類,是引用類型的,在對字符串作拼接時,如果字符串較多並且需要多次拼接的情況下,C#使用StringBuilder類實現字符串拼接。

1.4.4 DataView的使用

獲取DataView對象數據前,必須判斷DataView中有數據.
正確 錯誤

DataView dv= XX.Select(“123”);
if(dv.count>0)
{
    string a =dv[0][“name”];
}	DataView dv= XX.Select(“123”);
string a =dv[0][“name”];

針對DataView中的數據對象,如果需要判斷爲空,不能與null比較,因爲該對象永遠不會返回null,假如沒有數據,返回的時DBNull對象。

DataView dv= XX.Select(“123”);
if(dv.count>0)
{
    If(dv[0][“name”].ToString()!=””)
    {
        //XXXXX
    }
}	DataView dv= XX.Select(“123”);
if(dv.count>0)
{
    If(dv[0][“name”]!=null)
    {
        //XXXXX
    }
}

1.4.5 減少頻繁訪問數據庫的代碼

循環體中訪問數據庫表並且當該訪問表腳本很慢時,如datagrid前臺綁定方法展示(簡單表不作要求,數據量多且表結構較複雜的應儘量減少,方法是:一次性取出放內存,前臺方法從內存中讀取展示;通過聯合查詢、存儲過程從庫中一次性取出);其他for foreach while循環中有訪問數據庫表腳本應避免!
一次性取出的不要變相重複取,如上面已經定義了MisGuidRow,後面又重複出現該表的MisGuidRow。

1.4.6 SQL語句禁忌

避免使用select * from,一個原因是減少I/O開銷,另外一個原因是走索引(不用建太多的覆蓋索引、組合索引)。建議方法傳字段參數,用多少取多少,自己可以用,別人也可以用。
避免只是爲判斷是否存在,使用dv.count,尤其是dv是select * 返回的。

數據庫開發規範

2.1 語法規範

2.1.1 關鍵字及變量命名

  1. SQL中的關鍵字均使用大寫字母,字段名、表名均使用小寫字母。
  2. 數據表最好起別名,以便於的優化器快速分析。

2.1.2 插入語句INSERT

  1. 儘量不要使用 INSERT INTO table VALUE(?,?,?,?,?)格式,要指出具體要賦值的字段,INSERT...SELECT的效率會有提高。

2.1.3 查詢語句 SELECT

  1. SELECT與FROM語句之間只定義返回的字段名,除非返回所有的字段,儘量不要使用 * ,字段名應按照表的字段物理順序編寫,字段提取要按照“需多少、提多少”的原則(因爲大批量數據的抽取會影響SQL緩存的效率)。
  2. 使用COUNT()也是要避免的,因爲COUNT()會對全字段做聚集,建議使用COUNT (0)或COUNT(1)這樣的查詢語句。
  3. 條件中使用OR 會引起全表掃描,比較影響查詢效率,儘可能少用或不用,實在不行可以用UNION代替。NULL的檢索要回避一下。
  4. 負邏輯如!=、<>、not in等,都會導致用表掃描來完成查詢。當表較大時,會嚴重影響系統性能,可以用別的操作來代替。
  5. 使用DISTINCT是爲了保證在結果集中不出現重複值,但是DISTINCT會產生一張工作表,並進行排序來刪除重複記錄,這會大大增加查詢和I/O的操作次數。因此應當避免使用DISTINCT關鍵字。
  6. 使用ORDER BY和GROUP BY短語,任何一種索引都有助於SELECT的性能提高。注意如果索引列裏面有NULL值,優化器將無法優化。

2.2 索引規範

2.2.1 索引創建的規則

  1. 通常如果一個表有5個字段經常作爲查詢條件,那麼創建5個單獨字段的索引,然後再創建一個包含這5個字段的組合索引。索引的列儘量編寫在where條件語句的最後,以便執行計劃命中索引。

2.2.2 索引不被使用

索引不被使用的幾種情況:null,比較,not函數

2.2.3 索引列上不要計算

索引是針對原值建的二叉樹,計算後原來的二叉樹就用不上了。

2.2.4 索引列上>= 代替

  1. 高效:select * from emp where deptno >=4
    低效:select * from emp where deptno > 3
    兩者的區別在於,前者dbms將直接跳到第一個deptno等於4的記錄,而後者將首先定位到deptno等於3的記錄並且向前掃描到第一個deptno大於3的。

2.3 注意事項

  1. 避免使用IN和NOT IN,使用EXIST和NOT EXIST代替。
  2. 將計算從等號左邊移到右邊,例如:把a*2>4 改爲a>4/2;把TO_CHAR(zip) = ‘94002’ 改爲zip = TO_NUMBER(‘94002’)。
  3. 不要使用NOT,如Goods_no != 2,要改爲: where Goods_no>2 or Goods_no<2。
  4. 不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改爲: WHERE DEPT_CODE >=0;
  5. 刪除全表數據時使用truncate 替代 delete,同時注意truncate只能在刪除全表時適用,因爲truncate是ddl而不是dml語句。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章