1. 引言
本文是一套面向C# programmer 和C# developer 進行開發所應遵循的開發規范。
按照此規范來開發C#程序可帶來以下益處:
· 代碼的編寫保持一致性,
· 提高代碼的可讀性和可維護性,
· 在團隊開發一個項目的情況下,程序員之間可代碼共享
· 易於代碼的回顧,
本規范是初版,只適用於一般情況的通用規范,並不能覆蓋所有的情況。
2. 文件組織
2.1 C# 源文件
類名或文件名要簡短,不要超過2000LOC,將代碼分割開,使結構清晰。將每個類放在一個單獨的文件中,使用類名來命名文件名(當然擴展名是.cs)。這種約定會使大家工作更簡單。
2.2 目錄設計
為每一個命名空間創建一個目錄。(用MyProject/TestSuite/TestTier作為MyProject.TestSuite.TestTier的路徑,而不用帶點的命名空間名做路徑)這樣可以更容易地將命名空間映射到目錄層次劃分。
3. 縮進
3.1 換行
當一個表達式超過一行時,根據這些通用原則進行處理:
· 在逗號後換行。
· 在操作符後換行。
· 在高層換行而不要在低層處換行。
· 折行後對齊上一行語句同一層的表達式起始位置。
方法調用換行示例:
longMethodCall(expr1, expr2,
expr3, expr4, expr5);
算術表達式換行示例:
推薦:
var = a * b / (c - g + f) +
4 * z;
不好的格式——應避免:
var = a * b / (c - g +
f) + 4 * z;
推薦使用第一種方法,因為是在括號表達式之外折行(高層次折行原則)。注意要用制表符到縮進的位置,然後用用空格到折行的位置。在我們的例子中是:
> var = a * b / (c - g + f) +
> ......4 * z;
>表示是制表符,.表示是空格符。(制表符後是空白是用制表符縮進)。一個好的編碼習慣就是在所用的編輯器中顯示制表符和空格符。
3.2 空白
利用空格進行縮進從未有過統一的標准。一些人喜歡用兩個空格,一些人喜歡用四個空格而還有一些人喜歡用八個空格,甚至有的人喜歡用更多的空格。好的做法是用制表符。制表符有一些優點:
· 每個人都可以設置他們自己喜歡的縮進層級。
· 它僅僅是1個字符而不是2,4,8等等,因此它將減少輸入(甚至因為自動縮進,有時你不得不手工設置縮進或取消設置,等等諸如此類的操作)。
· 如果你想增加或減少縮進,可以標記一塊,使用Tab增加縮進層級而用Shift-Tab減少縮進層級。這幾乎對於任何文本編輯器都是適用的。
這裡,我們定義制表符為標准縮進符。
不要用空格縮進—用制表符!
4. 注釋
4.1 塊注釋
塊注釋通常應該是被避免的。推薦使用///注釋作為C#的標准聲明。如果希望用塊注釋時你應該用以下風格:
/* Line 1
* Line 2
* Line 3
*/
因為樣可以為讀者將注釋塊與代碼塊區分開。雖然並不提倡使用C風格的單行注釋,但你仍然可以使用。一旦用這種方式,那麼在注釋行後應有斷行,因為很難看清在同一行中前面有注釋的代碼:
/* blah blah blah */
塊注釋在極少情況下是有用的。通常塊注釋用於注釋掉大的代碼段。
4.2 單行注釋
你應該用//注釋風格“注釋掉”代碼(快捷鍵,Alt+/)。它也可以被用於代碼的注釋部分。
單行注釋被用於代碼說明時必須縮進到相應的編進層級。注釋掉的代碼應該放在第一行被注釋掉以使注釋掉的代碼更容易看清。
一條經驗,注釋的長度不應該超過被解釋代碼的長度太長,因為這表示代碼過於復雜,有潛在的bug。
4.3 文件注釋
在.net 框架,Microsoft 已經介紹了一個基於XML 注釋的文件。這些文件是包括XML 標簽的正規的單行的C#注釋。他們遵循單行注釋的模式:
/// <summary>
/// This class...
/// </summary>
多行XML 注釋遵循這種模式:
/// <exception cref=”BogusException”>
/// This exception gets thrown as soon as a
/// Bogus flag gets set.
/// </exception>
為了被認作是XML注釋行,所有的行都必須用三個反斜線開始。標簽有以下兩類:
· 文件說明項
· 格式/參考
第一類包括像<summary>, <param> or <exception>的標簽。描述一個程序的API元素的這些文檔說明項必須寫清楚以方便其他程序員。如上面的多行注釋示例所示,這些標簽通常帶有名稱或cref屬性。編譯器會檢查這些屬性,所以它們必須是有效、正確的。第二類用諸如<code>, <list> or <para>標簽,用於控制備注說明的布局。
文件可以用‘文件’菜單中的‘創建’菜單產生。文件以HTML格式產生。
5. 聲明
5.1 每行的聲明數
推薦每行只有一個聲明,因為它可以方便注釋。
int level; // indentation level
int size; // size of table
當聲明變量時,不要把多個變量或不同類型的變量放在同一行,例如:
int a, b; //What is a? What does b stand for?
上面的例子也顯示了變量名不明顯的缺陷。當命名變量時要清晰。
5.2 初始化
局部變量一旦被聲明就要初始化。例如:
string name = myObject.Name;
或
int val = time.Hours;
注意:如果你初始化一個dialog,設計使用using語句:
using (OpenFileDialog openFileDialog = new OpenFileDialog()) {
...
}
5.3 類和接口聲明
當編寫C#類和接口時,應遵循以下格式化規則:
· 在方法名和圓括號“(”開始它的參數列表之間不要使用空格。
· 在聲明語句的下一行以大括號"{"標志開始。
· 以"}"結束,通過它自身的縮進與相應的開始標志匹配。
例如:
Class MySample : MyClass, IMyInterface
{
int myInt;
public MySample(int myInt)
{
this.myInt = myInt ;
}
void Inc()
{
++myInt;
}
void EmptyMethod()
{
}
}
對於一個大括號的位置參考10.1部分。
6. 語句
6.1 簡單語句
每行都應該只包含一條語句。
6.2 返回語句
一個返回語句不要用最外圍圓括號。不用:
return (n * (n + 1) / 2);
用: return n * (n + 1) / 2;
6.3 If, if-else, if else-if else 語句
if, if-else and if else-if else 語句看起來應該像這樣:
if (condition) {
DoSomething();
...
}
if (condition) {
DoSomething();
...
} else {
DoSomethingOther();
...
}
if (condition) {
DoSomething();
...
} else if (condition) {
DoSomethingOther();
...
} else {
DoSomethingOtherAgain();
...
}
6.4 for / foreach 語句
一個for語句應該如下形式:
for (int i = 0; i < 5; ++i) {
...
}
或者放置一行(考慮用一個while語句代替)
for (initialization; condition; update) ;
foreach語句