C#命名原則(Coding Rule)

命名規範

  • 只用Camel Case及Pascal Case。範例
  • 避免使用全大寫或全小寫的wording,除了單一個word可以全小寫。
  • 全域變數首字大寫、Local變數首字小寫。
  • 委派事件、函數名稱首字大寫,參數首字小寫。

控件命名

控件類型控件命名格式
Animation ControlaniXxx
ButtonbtnXxx
Check BoxchkXxx
ComboBoxcmbXxx
Date Time PickerdtpXxx
Edit ControltbXxx
Group BoxgrpXxx
Horizontal Scroll BarhsbXxx
IP Address ControlipXxx
List BoxlstXxx
List (View) ControllvwXxx
MenumXxx
Month Calendar ControlmclXxx
Picture BoxpctXxx
Progress ControlprgXxx
Radio BoxradXxx
Rich Edit ControlrtfXxx
Slider ControlsldXxx
Spin ControlspnXxx
Static TextlbXxx
SysLink ControllnkXxx
Tab ControltabXxx
Tree (View) ControltvwXxx
Vertical Scroll BarvsbXxx

Coding Style

  • 一個檔案只包含一個namespace,只包含一個class,
    class名稱與檔名符合。
  • Project名稱與dll名稱符合。
  • 大括號的 { 與 } 各自獨立新的一行。
  • 宣告變數時,每個變數都獨立一行。
  • Using namespace時,原生的namespace放最上面,
    最好都經過IDE的排序功能。
  • Visibility越高的,放越前面。
    外面看的到的,通常命名也都是Pascal。
    通常public放最上面,protected次之,
    internal次之,private放下面。
    建構式放上面,屬性放上面。
  • UI的實作使用region區分。
  • Namespace的階層與folder的階層一致。
  • 每一個code block,有 { } 括起來的,需按照block層級縮排。
  • 使用tab、斷行等對code進行排版。
  • 宣告Attribute時,每個Attribute獨立一行。


10-1

註解

  • 註解使用// …或/// …,不用/*…*/,除非是版權宣告。
  • 禁止使用”flowbox”,範例如下:
    10-2
  • inline comment只用來表示:假設、issues、演算法提示。
  • 依國際規範標示 //空格+註解文字。
  • 好的程式碼應該從程式碼本身就能表現語意,
    而不是透過註解來說明程式碼的用途。
  • 必要時可使用TODO、UNDONE、HACK等工作清單的關鍵字。

變數與型別

  • 宣告時要加上access modifier的宣告,而不使用默認的值。
    例如void MethodName()就是不好的,改用private void MethodName()。
  • 宣告access modifier時要謹慎,原則為:
    外面要使用此物件,能看到的東西最少,但又缺一不可。
    可見度範圍越小越好。
  • 宣告值的範圍,越小越好。
    可以用int就不用long,可以用double,就不用decimal。
  • 浮點數計算會有誤差,所謂『算錢用浮點,遲早被人扁』,
    需高精準度或算金額請用decimal。
  • 盡量不去修改Enum的預設型別(int),除非不夠大,需要用到long。
  • 宣告成constants的應該是簡單的型別,
    複雜的型別應使用readonly或static readonly。
  • 用as轉型並檢查是否為null防呆,而避免使用強轉型。
    『用as轉型+判斷null,再使用轉型後的物件』,這樣的效率,
    比『用is判斷型別,再強轉型,再使用轉型後的物件』好。
  • 盡量使用強型別。
  • 避免boxing與unboxing的發生,會損耗內存記憶體。
  • 字串前使用@,來讓字串本身更容易瞭解,而不用脫逸字元。
    也可以讓字串可透過斷行來排版。
  • 善用String.Format來呈現字串的pattern。
  • 善用StringBuilder來連結動態的字串。
  • 判斷字串是否為空字串,避免用==string.Empty或==””,
    而使用.Length==0,或是string.IsNullOrEmpty。
  • 判斷字串是否相等,盡量透過string.Compare是否為0,
    而不是透過toUpper()與toLower()轉換後比較。

流程控制

  • 避免遞迴,而改用loop。
  • 在foreach中,不要去異動集合範圍。
    例如在loop中去remove enumerated items。
  • 只在很單純的情況下,使用條件運算子(三元運算子),
    例如int result = isValid ? 9 : 4;
  • 不在判斷式裡面assign變數值,例如if((i=2)==2) {…}
  • 判斷式若為判斷某一個bool變數,則不需要再用==true或==false,
    因為bool值就代表該判斷式的意義。
    例如將if (isValid == true) {…} ,改寫成if (isValid) {…}
  • 判斷式組合太複雜時,請用多個bool來表示。
  • Switch case就只適合針對單一的變數進行比較,
    比較複雜的還是用if/else,但進階的設計方式,
    應該使用多型來取代switch case或多個判斷式。
  • goto 標籤: 只用於Switch case,迴圈中斷請使用break。

例外管理

  • 避免使用 try/catch 來當 if/else 用,
    try/catch應該要能明確捕捉特定的exception。
    嚴禁try/catch捕捉到錯誤後,完全沒處理。
  • 嚴禁在try/catch的catch block中,再使用 try/catch
  • 避免re-throw exception
    錯誤的例子:
    catch(Exception ex)
    {
    Log(ex);
    throw ex;
    }正確的例子:
    catch(Exception ex)
    {
    Log(ex);
    throw;
    }
  • 可以用判斷式來決定流程,就不用 try/catch。

也可看看

[實作]WordPress透過加密參數登入

新增relogin參數、修改登入參數陣列、以ASP.NET C#為例示範如何使用。

發表迴響