C#開發編碼規範

fengzj發表於2008-11-27

C#開發編碼規範

 

註記:

Pascal 大小寫形式——所有單詞第一個字母大寫,其他字母小寫。

Camel 大小寫形式——除了第一個單詞,所有單詞第一個字母大寫,其他字母小寫。

類名使用Pascal大小寫形式

public class HelloWorld

{

 

}

方法使用Pascal大小寫形式

public class HelloWorld

{

 void SayHello(string name)

 {

 

 }

}

變數和方法引數使用Camel 大小寫形式

public class HelloWorld

{

 int totalCount = 0;

 void SayHello(string name)

 {

  string fullMessage = "Hello " + name;

 

 }

}

    不要使用匈牙利方法來命名變數。

以前,多數程式設計師喜歡把資料型別作為變數名的字首而m_作為成員變數的字首。例如:

string m_sName;

int nAge;

然而,這種方式在.NET編碼規範中是不推薦的。所有變數都用Camel 大小寫形式,而不是用資料型別和m_來作字首。用有意義的,描述性的詞語來命名變數。別用縮寫。用nameaddresssalary等代替namaddrsal。別使用單個字母的變數象inx 等。使用 indextemp等。用於迴圈迭代的變數例外:

for ( int i = 0; i < count; i++ )

{

 

}

如果變數只用於迭代計數,沒有在迴圈的其他地方出現,許多人還是喜歡用單個字母的變數(i) ,而不是另外取名。變數名中不使用下劃線 (_) 。名稱空間需按照標準的模式命名。檔名要和類名匹配,例如,對於類HelloWorld,相應的檔名應為helloworld.cs (或,helloworld.vb)

 

縮排和間隔

縮排用TAB。不用 SPACES。註釋需和程式碼對齊。花括弧 ( {} ) 需和括號外的程式碼對齊。用一個空行來分開程式碼的邏輯分組。

 bool SayHello (string name)

 {

  string fullMessage = "Hello " + name;

  DateTime currentTime = DateTime.Now;

  string message = fullMessage + ",the time is : " + currentTime.ToShortTimeString();

  MessageBox.Show ( message );

  if ( … )

  {

   // Do something

   // …

   return false;

  }

  return true;

 }

             

這段程式碼看起來比上面的好:

 bool SayHello ( string name )

 {

  string fullMessage = "Hello " + name;

  DateTime currentTime = DateTime.Now;

    string message = fullMessage + ",the time is : " + currentTime.ToShortTimeString();

    MessageBox.Show ( message );

    if ( … )

  {

   // Do something

   // …

      return false;

  }

    return true;

 }

在一個類中,各個方法需用一空行,也只能是一行分開。花括弧需獨立一行,而不象iffor 等可以跟括號在同一行。

好:

  if ( … )

  {

   // Do something

  }

 

不好:

  if ( … ) {

   // Do something

  }

在每個運算子和括號的前後都空一格。

好:

  if ( showResult == true )

  {

   for ( int i = 0; i < 10; i++ )

   {

    //

   }

  }

不好:

  if(showResult==true)

  {

   for(int i= 0;i<10;i++)

   {

    //

   }

  }

 

良好的程式設計習慣

遵從以下良好的習慣以寫出好程式。

避免使用大檔案。如果一個檔案裡的程式碼超過300400行,必須考慮將程式碼分開到不同類中。避免寫太長的方法。一個典型的方法程式碼在125行之間。如果一個方法發程式碼超過25行,應該考慮將其分解為不同的方法。方法名需能看出它作什麼。別使用會引起誤解的名字。如果名字一目瞭然,就無需用文件來解釋方法的功能了。

好:

 void SavePhoneNumber ( string phoneNumber )

 {

  // Save the phone number.

 }

不好:

 // This method will save the phone number.

 void SaveData ( string phoneNumber )

 {

  // Save the phone number.

 }

一個方法只完成一個任務。不要把多個任務組合到一個方法中,即使那些任務非常小。

好:

 // Save the address

 SaveAddress (  address );

 

 // Send an email to the supervisor to inform. that the address is updated.

 SendEmail ( address,email ); 

 

 void SaveAddress ( string address )

 {

  // Save the address.

  // …

 }

 void SendEmail ( string address,string email )

 {

  // Send an email to inform. the supervisor that the address is changed.

  // …

 }

不好:

 // Save address and send an email to the supervisor to inform. that the address is updated.

 SaveAddress ( address, email );

 void SaveAddress ( string address, string email )

 {

  // Job 1.

  // Save the address.

  // …

  // Job 2.

  // Send an email to inform. the supervisor that the address is changed.

  // …

 }

使用C# VB.NET的特有型別,而不是System名稱空間中定義的別名型別。

好:

 int age;

 string name;

 object contactInfo;

不好:

 Int16 age;

 String name;

 Object contactInfo;

別在程式中使用固定數值,用常量代替。別用字串常數,用資原始檔。避免使用很多成員變數,宣告區域性變數,並傳遞給方法。不要在方法間共享成員變數,如果在幾個方法間共享一個成員變數,那就很難知道是哪個方法在什麼時候修改了它的值。必要時使用enum,別用數字或字串來指示離散值。

好:

 enum MailType

 {

  Html,

  PlainText,

  Attachment

 }

 void SendMail (string message,MailType mailType)

 {

  switch ( mailType )

  {

   case MailType.Html:

    // Do something

    break;

   case MailType.PlainText:

    // Do something

    break;

   case MailType.Attachment:

    // Do something

    break;

   default:

    // Do something

    break;

  }

 }

不好:

 void SendMail (string message, string mailType)

 {

  switch ( mailType )

  {

   case "Html":

    // Do something

    break;

   case "PlainText":

    // Do something

    break;

   case "Attachment":

    // Do something

    break;

   default:

    // Do something

    break;

  }

 }

別把成員變數宣告為 public protected。都宣告為private 而使用 public/protected Properties。不在程式碼中使用具體的路徑和驅動器名,使用相對路徑,並使路徑可程式設計。永遠別設想你的程式碼是在“C:”盤執行。你不會知道,一些使用者在網路或“Z:”盤執行程式。應用程式啟動時作些“自檢”並確保所需檔案和附件在指定的位置。必要時檢查資料庫連線。出現任何問題給使用者一個友好的提示。如果需要的配置檔案找不到,應用程式需能自己建立使用預設值的一份。如果在配置檔案中發現錯誤值,應用程式要丟擲錯誤,給出提示訊息告訴使用者正確值。錯誤訊息需能幫助使用者解決問題。永遠別用象“應用程式出錯”,“發現一個錯誤”等錯誤訊息。而應給出象“更新資料庫失敗,請確保登陸id和密碼正確。” 的具體訊息。顯示錯誤訊息時,除了說哪裡錯了,還應提示使用者如何解決問題。不要用象“更新資料庫失敗。”這樣的,要提示使用者怎麼做:“更新資料庫失敗,請確保登陸id和密碼正確。”

顯示給使用者的訊息要簡短而友好。但要把所有可能的資訊都記錄下來,以助診斷問題。

 

註釋

別每行程式碼,每個宣告的變數都做註釋。在需要的地方註釋。可讀性強的程式碼需要很少的註釋,如果所有的變數和方法的命名都很有意義,會使程式碼可讀性很強並無需太多註釋。行數不多的註釋會使程式碼看起來優雅。但如果程式碼不清晰,可讀性差,那就糟糕。如果因為某種原因使用了複雜艱澀的原理,為程式配備良好的文件和重分的註釋。對一個數值變數採用不是0-1等的數值初始化,給出選擇該值的理由。簡言之,要寫清晰,可讀的程式碼以致無須什麼註釋就能理解。對註釋做拼寫檢查,保證語法和標點符號的正確使用。

 

異常處理

不要“捕捉了異常卻什麼也不做”。如果隱藏了一個異常,你將永遠不知道異常到底發生了沒有。發生異常時,給出友好的訊息給使用者,但要精確記錄錯誤的所有可能細節,包括髮生的時間,和相關方法,類名等。只捕捉特定的異常,而不是一般的異常。

好:

 void ReadFromFile ( string fileName )

 {

  try

  {

   // read from file.

  }

  catch (FileIOException ex)

  {

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/219982/viewspace-503626/,如需轉載,請註明出處,否則將追究法律責任。