寫在前面:本文是根據alibaba的Java開發手冊以及WPF源碼整理的一篇適用於C#的開發規範。git
命名風格
- 代碼中的命名嚴禁使用拼音與英文混合的方式,更不容許直接使用中文的方式。
- 命名空間、類名、方法、屬性、事件、枚舉、公有靜態字段、常量使用UpperCamelCase風格。
- 私有字段、參數名、局部變量使用lowerCamelCase風格,聽從駝峯形式。
- 異常類名使用Exception結尾,測試類名以要測試的類名開頭,Test結尾。
- 避免在子父類的成員變量間、不一樣代碼塊的局部變量間採用相同的命名。
- 杜毫不規範的縮寫,要作到望文生義。使用縮寫時要是被廣泛接受的縮寫。
- 爲達到代碼自解釋的目標,命名時應儘可能使用完整的單詞組合表達意思。
- 在常量與變量命名時,表示類型的名稱放在詞尾:
startTime
, workQueue
- 接口類中的方法和屬性不要加任何修飾符號,加上有效的註釋。
- 接口類加I前綴。
- 枚舉類名不要加Enum後綴,枚舉成員名稱使用UpperCamelCase風格命名。
- 用於事件處理的委託加EventHandler後綴,用於事件處理以外的委託加CallBack後綴。
- 在變量名中使用互補對,如min/max、begin/end、open/close
- 不要在事件聲明中使用前綴或者後綴,如應使用Close而不是OnClose。
若是變量值僅在一個固定範圍內變化,使用enum類型定義:github
public enum Season
{
Spring,
Summer,
Autumn,
Winter
}
- 用UI組件縮寫作UI變量前綴,如:
Label - lbl
TextBox - tbox
TextBlock - tblk
Button - btn
Image - img
Grid - grd
StackPanle - stkpnl
代碼格式
- 若大括號內爲空,簡潔的寫成{}便可,大括號中間無需換行和空格;若是非空代碼塊則左右大括號各佔一行。
- 左小括號和字符之間不出現空格,右小括號和字符間也不要出現空格。
- if/for/while/switch/do等保留字與括號之間必須加空格。
- 任何二目、三目運算符的左右兩邊都須要加一個空格。
- 採用四個空格縮進,禁止使用tab,可在IDE中設置tab爲4個空格。
- 註釋的雙斜線與註釋之間有且只有一個空格。
- 在進行類型強制轉換時,右括號與強制轉換值之間不須要空格。
- 單行字符數限制不超過120個,超出則換行,換行原則以下:
1) 第二行相對第一行縮進4個空格,從第三行開始,再也不縮進;
2) 運算符與下文一塊兒換行;
3) 方法調用的點符號與下文一塊兒換行;
4) 方法調用的多個參數換行時,在逗號後換行;
5) 括號前不要換行數據庫
- 方法參數在定義和傳入時,多個參數逗號後必須加空格。
- 單個方法的總行數不超過80行。
- 不須要添加若干個空格使變量的賦值等號與上一行對應位置的等號對齊。
- 不一樣邏輯、不一樣語義、不一樣業務的代碼之間插入一個空行分隔開以提高可讀性。如下狀況下使用一個空行:
a. 方法與方法,屬性與屬性之間;
b. 方法中變量聲明與語句之間;
c. 方法中不一樣邏輯塊之間;
d. 方法中的返回語句與其餘語句之間;
e. 屬性與方法,屬性與字段,方法與字段之間;ide
- 任何情形下,不須要插入多個空行進行隔開。
- 一行只作一個聲明。
- 建議在變量聲明時就對其作初始化。
- 不要使用public的實例字段。
- 每行一個語句。
面向對象
- 全部覆蓋的方法,必須加override。
- 外部正在使用的接口,不容許修改方法簽名,避免對接口調用產生影響。
- 構造函數中禁止加入任何業務邏輯,若是有初始化邏輯,請放在init方法中。
- 一個類有多個構造方法,或多個同名方法時這些方法應該按順序放在一塊兒,便於閱讀。
- 類內方法定義的順序:公有 > 保護 > 私有。
- 屬性的get、set方法中,不要增長業務邏輯,增長排查問題的難度。
- 慎用對象的Clone方法來拷貝對象,由於是淺拷貝,若想實現深拷貝需覆蓋Clone方法。
- 類成員與方法的訪問嚴格控制:
1) 若是不容許外部直接經過new來建立對象,構造函數必須是private;
2) 工具類不能有public構造方法;
3) 類非static字段必須是private;
4) 類static若是僅在本類使用,必須是private;
5) 類方法若是僅供內部調用,必須是private;
6) 類方法只對繼承類公開,限制爲protected。函數
- 不要給成員變量加任何前綴,區分局部變量與成員變量使用this。
- 類名與文件名保持一致。
- 類型成員的排列順序:
1) 委託、事件聲明
2) 公共靜態、常量字段
3) 構造函數,參數越少越靠前
4) public方法
5) 屬性
6) protected方法 -> private方法 -> internal方法
7) 私有字段工具
控制語句
- 一個switch中,每一個case要麼經過continue/break/return等來終止,要麼註釋說明程序將執行到哪個case爲止。一個switch中,必須包含一個default語句放在最後,即便什麼代碼也沒有。
- 當switch內的變量類型爲string且爲外部參數時,必須先進行null判斷。
- 在if/else/for/while/do語句中必須使用大括號,即便只有一行代碼。
- if()...else...嵌套語句不要超過3層,避免代碼維護困難。
- 不要在條件判斷語句中執行復雜的語句,將複雜的邏輯判斷結果賦值給一個有意義的布爾值,以提升可讀性。
- 不要在其餘表達式中插入賦值語句,賦值語句應該單獨成行。
- 循環語句要考慮性能,定義對象、變量、獲取數據庫連接、沒必要要的try-catch等儘可能移至循環體外處理。
- 儘可能避免採用取反邏輯運算符,不易理解。
註釋
字段、屬性、枚舉值註釋:性能
/// <summary>
/// ...
/// </summary>
public bool IsActive
{
...
}
方法、委託註釋:測試
/// <summary>
/// ...
/// </summary>
/// <param name="">...</param>
/// <returns>...</returns>
/// <remarks>(可選)
/// ...
/// </remarks>
private bool Function(int param)
{
...
}
類、接口註釋:this
/// <summary>
/// ...
/// </summary>
public class ClassName
{
...
}
- 方法內部的單行註釋,在被註釋語句上方另起一行,使用//註釋。方法內部多行註釋使用//註釋,不要使用/**/。
- 全部枚舉類型的字段必需要有註釋,說明數據項的用途。
- 代碼修改的同時,註釋也要相應修改。
- 謹慎註釋掉代碼。在上方註釋詳細說明,而不是簡單的註釋掉。若是無用,則刪除。
- 好的命名、代碼結構是自解釋的,註釋力求精簡準確、表達到位。避免過多過濫的註釋,不然代碼一旦修改,註釋的修改負擔很大。
- 特殊註釋標記,需註明標記人與時間。應及時處理這些標記。如:
1) 待辦(TODO):(標記人,標記時間,[預計處理時間])表示須要實現但暫未實現的功能;
2) 錯誤,不能工做(FIXME):(標記人,標記時間,[預計處理時間])錯誤代碼且不能工做,需及時糾正。指針
- 右花括號"}"後建議添加註釋,以便找到對應的"{"。
- 避免在代碼行尾添加註釋,僅方法內變量聲明或花括號後的註釋使用行尾註釋。
文件註釋:
// <copyright file="*.cs" company="Hisense">
// Copyright (c) Hisense. All rights reserved.
// </copyright>
// <author>xxx</author>
// <date>yyyy-mm-dd</date>
// <summary>...</summary>
// <modify>(可選)
// 修改人:
// 修改時間:
// 描述:
// </modify>
異常處理
- 經過預檢查的方式規避RuntimeException異常,不該該經過catch來處理,如空指針異常,越界異常等。
- 異常不要用來作流程控制,條件控制。
- 對於catch儘量區分異常類型,再作對應的異常處理。
- 必須處理異常,不然將其拋給調用者。最外層的業務使用者,必須處理異常,將其轉化爲用戶能夠理解的內容。
- finally塊必須對資源對象、流對象進行關閉,有異常也要作try-catch。
- 不要在finally中作return,不然會丟掉try中的返回點。
- 方法的返回值能夠爲null,但必須加註釋說明什麼狀況下返回null。
- 應盡全力避免NPE(空指針異常)。
- 避免產生重複的代碼,不然後期修改時須要修改多個地方,容易遺漏。