首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 編碼風格指南:Mike Krüger 版本 0.3 完整中文詳解

     編輯:關於C語言

文件資訊

  • 作者:Mike Krüger (icsharpcode.net)
  • 版本:0.3
  • 來源:SharpDevelop 專案編碼標準
  • 適用:C# 專案,原則可延伸至其他語言

1. 檔案組織

1.1 原始碼檔案

  • 類別/檔案保持簡短,**不超過 2000 行**
  • 每個類別獨立檔案,檔名與類別名一致(MyClass.cs)
  • 目錄結構對應命名空間:MyProject.TestSuite.TestTier → MyProject/TestSuite/TestTier/

1.2 目錄佈局

命名空間層級對應目錄層級,不用點號扁平化,利於導航與建置腳本。

2. 縮排與換行

2.1 換行原則

  • 逗號後換行
  • 運算子後換行
  • 優先高層級換行(括號外優先於括號內)
  • 新行對齊上一行同層級運算式起始位置

範例


// 推薦:高層級換行
var = a * b / (c - g + f) +
    4 * z;

// 避免:括號內換行
var = a * b / (c - g +
    f) + 4 * z;

2.2 空白字元:Tab vs Space

  • 標準:Tab 字元(非空白)
  • 優點:個人偏好縮排寬度、單字元、Shift-Tab 快速調整
  • 續行對齊用空白:> var = a * b / (c - g + f) + > ......4 * z;(>=Tab, .=Space)
  • 編輯器顯示不可見字元

3. 註解規範

3.1 區塊註解

  • 原則上避免,改用 XML 文件註解 ///
  • 必要時風格:/* Line 1 * Line 2 * Line 3 */
  • 單行區塊註解後換行,避免同行程式碼難辨識

3.2 單行註解

  • // 用於註解掉代碼(SharpDevelop Alt+/)
  • 文件註解縮排與程式碼同層級
  • 註解長度不應過度超過代碼(暗示過度複雜)

3.3 XML 文件註解


// 單行
/// This class...

// 多行
/// 
/// This exception gets thrown as soon as a
/// Bogus flag gets set.
/// 

// 標籤分類:
// 1. 文件項目:summary, param, exception, returns, value...
// 2. 版面/引用:code, list, para, see, seealso...

4. 宣告規範

4.1 每行一宣告


int level; // indentation level
int size;  // size of table

// 避免
int a, b; // a 是什麼?b 代表什麼?

4.2 就近初始化


string name = myObject.Name;
int val = time.Hours;

// Dialog 使用 using
using (var dlg = new OpenFileDialog()) { ... }

4.3 類別/介面宣告格式

  • 方法名與左括號無空白:void Method()
  • 左大括號換行
  • 右大括號獨佔行,對齊對應左括號

class MySample : MyClass, IMyInterface {
    int myInt;
    public MySample(int myInt) {
        this.myInt = myInt;
    }
    void Inc() { ++myInt; }
    void EmptyMethod() { }
}

5. 陳述句規範

5.1 簡單陳述句

  • 每行一陳述句

5.2 return 陳述句

  • 無外層括號:return n * (n + 1) / 2;

5.3 if/else 結構


if (condition) { DoSomething(); }
if (condition) { DoSomething(); } else { DoOther(); }
if (cond1) { ... } else if (cond2) { ... } else { ... }

5.4 迴圈


for (int i = 0; i < 5; ++i) { ... }
foreach (int i in IntList) { ... }
while (condition) { ... }
do { ... } while (condition);
  • 單行迴圈考慮改 while
  • 即使單一陳述句也加大括號

5.5 switch


switch (condition) {
    case A: ... break;
    case B: ... break;
    default: ... break;
}

5.6 try/catch/finally


try { ... } catch (Exception) { }
try { ... } catch (Exception e) { ... }
try { ... } catch (Exception e) { ... } finally { ... }

6. 空白行與間距

6.1 空白行

  • 邏輯區段間:兩空行
  • 類別/介面定義間:兩空行
  • 方法/屬性間:一空行
  • 區域變數與首個陳述句間:一空行
  • 方法內邏輯區塊:一空行
  • 空白行需同層級縮排(利於插入)

6.2 項間空白

  • 逗號/分號後一空白:Method(a, b, c);
  • 運算子前後各一空白(單元運算子除外):a = b; for (int i = 0; i < 10; ++i)

6.3 表格式對齊

  • 邏輯相關行以空白對齊成表格
  • 用空白非 Tab(避免不同 Tab 寬度錯位)

string name   = "Mr. Ed";
int    myValue = 5;
Test   aTest   = Test.TestYou;

7. 命名慣例

7.1 大小寫風格

7.2 命名指導原則

  • 禁用底線、匈牙利命名法(GUI 控制項除外)
  • 好名稱描述「語意」而非「型別」
  • GUI 欄位/變數後綴型別全名:cancelButton, nameTextBox

7.3 具體命名規則

風格規則範例
PascalCase每個單字首字大寫TestCounter
camelCase首單字小寫,其餘大寫testCounter
UPPER_CASE僅 1-2 字母縮寫PI, E

7.4 大小寫總覽表

目標規則範例
類別/結構名詞/名詞片語,PascalCase,無前綴UserService
介面名詞/形容詞,PascalCase,I 前綴IEnumerable
列舉型別/值PascalCase,無前後綴,單數名稱Color.Red
位元欄位列舉複數名稱FileAccessFlags
const/readonly 靜態欄位PascalCaseMaxConnections
參數/非 const 欄位camelCase,語意導向userName
區域變數camelCase,計數器可用 i,j,kindex
方法動詞/動詞片語,PascalCaseCalculateTotal
屬性名詞/名詞片語,PascalCaseUserName
事件處理器EventHandler 後綴,sender/e 參數Button_Click
事件參數類別EventArgs 後綴ClickEventArgs
事件名稱動詞,現在/過去式區分前後Opening, Opened
類型大小寫備註
Class/StructPascalCase
InterfacePascalCaseI 開頭
Enum 值/型別PascalCase
EventsPascalCase
Exception 類別PascalCaseException 結尾
Public 欄位PascalCase
MethodsPascalCase
NamespacePascalCase
PropertyPascalCase
Protected/Private 欄位camelCase
ParameterscamelCase

8. 程式設計實務

8.1 可見性

  • 實例/類別欄位預設 private(不寫 private 關鍵字)
  • 對外暴露用屬性
  • public static const 欄位例外允許

8.2 魔術數字


// 避免
if (count > 427) ...

// 採用
public const int MaxUsers = 427;
if (count > MaxUsers) ...

9. 程式碼範例

9.1 大括號位置範例


namespace ShowMeTheBracket {
    public enum Test { TestMe, TestYou }
    public class TestMeClass {
        Test test;
        public Test Test {
            get { return test; }
            set { test = value; }
        }
        void DoSomething() {
            if (test == Test.TestMe) { ... }
            else { ... }
        }
    }
}

左大括號換行位置:命名空間、類別/介面/結構、方法宣告

9.2 變數命名範例:質數篩選


// 避免:i, j 無語意
for (int i = 1; i < num; ++i) { meetsCriteria[i] = true; }
for (int i = 2; i < num / 2; ++i) {
    int j = i + i;
    while (j <= num) { meetsCriteria[j] = false; j += i; }
}

// 推薦:語意化命名
for (int primeCandidate = 1; primeCandidate < num; ++primeCandidate)
    isPrime[primeCandidate] = true;
for (int factor = 2; factor < num / 2; ++factor) {
    int factorableNumber = factor + factor;
    while (factorableNumber <= num) {
        isPrime[factorableNumber] = false;
        factorableNumber += factor;
    }
}

總結

這份風格指南強調一致性、可讀性、可維護性。核心爭議點在於 Tab 縮排與 3 空白續行對齊,但內部統一即可。建議團隊採用 .editorconfig 落地執行,並整合至 CI 檢查流程。命名慣例與檔案組織是長期受益最高的規範,值得嚴格執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved