目錄
C#語言編程規範
遵循一定的編程規範,即有利於工程建設、團隊合作,也是每個程序員的自身素質的體現。本文結合研發羣實際工作情況,篩選了部分重要的、易實現的規範
1.1 命名規範
1.1.1 標識符命名
- 標識符的命名應當符合“min-length && max-information”(最小長度&最大信息量)原則。
- 標識符要採用常用英文單詞或其組合,便於記憶和閱讀,儘量避免使用漢語拼音來命名,推薦採用應用領域相關的術語來命名。
- 標識符只能由26個英文字母,10個數字,及下劃線的一個子集來組成,並嚴格禁止使用連續的下劃線(不易分辨),下劃線也不能出現在標識符頭或結尾(預編譯開關和利用工具生成的代碼除外);數字也不能出現在標識符的頭部。
- 常量名都要使用大寫字母, 用下劃線 ‘_’ 分割單詞。
- 程序中不要出現僅靠大小寫區分的相似的標識符。
推薦 | 不推薦 |
---|---|
string strName; | string strOtherName; |
string strname; | string STRNAME; |
- 一般變量名不得取單個字符(如i、j、k等)作爲變量名,局部循環變量除外。
- 儘量避免名字中出現數字編號,如Value1、Value2等,除非邏輯上的確需要編號。
1.1.2 類、方法命名
- 類名採用大小寫結合的方法,構成類名的每個單詞的首字母的首字母也必須大寫。在構成類名的單詞之間不用下劃線。
- 接口命名在名字前加上“I”前綴,其它和類命名規範相同。
- 類方法的局部變量命名採用Camel規範或匈牙利規範。
- 方法名用大寫字母開頭的單詞組合而成,且應當使用“動詞”或者“動詞+名詞”(動賓詞組)。
1.1.3 控件命名
- 控件命名應採用完整的英文描述符命名,名字的前綴是控件類型名縮寫,符合匈牙利命名規範。
推薦 | 不推薦 |
---|---|
Lable控件 lblName | Lable控件 Name |
Button控件 btnSave | Button控件Save |
TextBox控件 txtName | TextBox控件 Name |
DataGrid控件 gridList | DataGrid控件 list1 |
1.2 代碼佈局
- 源代碼文件(.cs)的佈局順序是:using語句、命名空間、類。
- if、else、else if、for、while、do等語句自佔一行,執行語句不得緊跟其後。不論執行語句有多少都要加 { }。
//推薦
if (iCount < 100)
{
iCount = 500;
}
//不推薦
if (iCount < 100) iCount = 500;
- 禁止使用TAB鍵,必須使用空格進行縮進。縮進爲4個空格。
- 程序的分界符‘{’和‘}’應獨佔一行並且位於同一列,同時與引用它們的語句左對齊。{ }之內的代碼塊使用縮進規則對齊。
推薦 不推薦
//推薦
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 表達式和語句
- 在表達式中使用括號,使表達式的運算順序更清晰。
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 關鍵字及變量命名
- SQL中的關鍵字均使用大寫字母,字段名、表名均使用小寫字母。
- 數據表最好起別名,以便於的優化器快速分析。
2.1.2 插入語句INSERT
- 儘量不要使用 INSERT INTO table VALUE(?,?,?,?,?)格式,要指出具體要賦值的字段,INSERT...SELECT的效率會有提高。
2.1.3 查詢語句 SELECT
- SELECT與FROM語句之間只定義返回的字段名,除非返回所有的字段,儘量不要使用 * ,字段名應按照表的字段物理順序編寫,字段提取要按照“需多少、提多少”的原則(因爲大批量數據的抽取會影響SQL緩存的效率)。
- 使用COUNT()也是要避免的,因爲COUNT()會對全字段做聚集,建議使用COUNT (0)或COUNT(1)這樣的查詢語句。
- 條件中使用OR 會引起全表掃描,比較影響查詢效率,儘可能少用或不用,實在不行可以用UNION代替。NULL的檢索要回避一下。
- 負邏輯如!=、<>、not in等,都會導致用表掃描來完成查詢。當表較大時,會嚴重影響系統性能,可以用別的操作來代替。
- 使用DISTINCT是爲了保證在結果集中不出現重複值,但是DISTINCT會產生一張工作表,並進行排序來刪除重複記錄,這會大大增加查詢和I/O的操作次數。因此應當避免使用DISTINCT關鍵字。
- 使用ORDER BY和GROUP BY短語,任何一種索引都有助於SELECT的性能提高。注意如果索引列裏面有NULL值,優化器將無法優化。
2.2 索引規範
2.2.1 索引創建的規則
- 通常如果一個表有5個字段經常作爲查詢條件,那麼創建5個單獨字段的索引,然後再創建一個包含這5個字段的組合索引。索引的列儘量編寫在where條件語句的最後,以便執行計劃命中索引。
2.2.2 索引不被使用
索引不被使用的幾種情況:null,比較,not函數
2.2.3 索引列上不要計算
索引是針對原值建的二叉樹,計算後原來的二叉樹就用不上了。
2.2.4 索引列上>= 代替
- 高效:select * from emp where deptno >=4
低效:select * from emp where deptno > 3
兩者的區別在於,前者dbms將直接跳到第一個deptno等於4的記錄,而後者將首先定位到deptno等於3的記錄並且向前掃描到第一個deptno大於3的。
2.3 注意事項
- 避免使用IN和NOT IN,使用EXIST和NOT EXIST代替。
- 將計算從等號左邊移到右邊,例如:把a*2>4 改爲a>4/2;把TO_CHAR(zip) = ‘94002’ 改爲zip = TO_NUMBER(‘94002’)。
- 不要使用NOT,如Goods_no != 2,要改爲: where Goods_no>2 or Goods_no<2。
- 不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改爲: WHERE DEPT_CODE >=0;
- 刪除全表數據時使用truncate 替代 delete,同時注意truncate只能在刪除全表時適用,因爲truncate是ddl而不是dml語句。