當(dāng)前位置:首頁>>軟件教程>>常用軟件>>新聞內(nèi)容    |
C# 編碼規(guī)范和編程好習(xí)慣
作者:翻譯:楊賀宏 發(fā)布時間:2004-8-10 14:03:29 | 【字體:

誰都會寫代碼!幾個月的編程經(jīng)驗可以讓你寫出“可運行應(yīng)用程序”。讓它可運行容易,但是以最有效率的方式編碼就需要下更多的功夫!

要知道,大多數(shù)程序員在寫”可運行代碼,“而不是”高效代碼“。我們在這個指南課程前面提到,你想成為你們公司”最尊貴的專業(yè)人員“嗎?寫”高效代碼“是一項藝術(shù),你必須學(xué)習(xí)和實踐它。

命名慣例和規(guī)范



注記 :
Pascal 大小寫形式-所有單詞第一個字母大寫,其他字母小寫。
Camel   大小寫形式-除了第一個單詞,所有單詞第一個字母大寫,其他字母小寫。

  • 類名使用Pascal 大小寫形式
    public class HelloWorld
    {
     ...
    }
    

  • 方法使用Pascal 大小寫形式
    public class HelloWorld
    {
     void SayHello(string name)
     {
      ...
     }
    }

  • 變量和方法參數(shù)使用Camel 大小寫形式


    public class HelloWorld
    {
     int totalCount = 0;
     void SayHello(string name)
     {
      string fullMessage = "Hello " + name;
      ...
     }
    }
      
  • 不要使用匈牙利方法來命名變量

    以前,多數(shù)程序員喜歡它-把數(shù)據(jù)類型作為變量名的前綴而m_作為成員變量的前綴。例如:
    
    string m_sName;
    int nAge;
    
        
    然而,這種方式在.NET編碼規(guī)范中是不推薦的。所有變量都用camel 大小寫形式,而不是用數(shù)據(jù)類型和m_來作前綴。
  • 用有意義的,描述性的詞語來命名變量

    - 別用縮寫。用name, address, salary等代替 nam, addr, sal
    - 別使用單個字母的變量象i, n, x 等. 使用 index, temp
    用于循環(huán)迭代的變量例外:
    for ( int i = 0; i < count; i++ )
    {
     ...
    }
    
    如果變量只用于迭代計數(shù),沒有在循環(huán)的其他地方出現(xiàn),許多人還是喜歡用單個字母的變量(i) ,而不是另外取名。
    - 變量名中不使用下劃線 (_) 。
    - 命名空間需按照標(biāo)準(zhǔn)的模式命名
    ...
    

  • 文件名要和類名匹配

    例如,對于類HelloWorld, 相應(yīng)的文件名應(yīng)為 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; }
  • 在一個類中,各個方法需用一空行,也只能是一行分開。
  • 花括弧需獨立一行,而不象if, for 等可以跟括號在同一行。.
    好:
      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++)
       {
        //
       }
      }
    

    良好的編程習(xí)慣


    遵從以下良好的習(xí)慣以寫出好程序

  • 避免使用大文件。如果一個文件里的代碼超過300~400行,必須考慮將代碼分開到不同類中。
  • 避免寫太長的方法。一個典型的方法代碼在1~25行之間。如果一個方法發(fā)代碼超過25行,應(yīng)該考慮將其分解為不同的方法。
  • 方法名需能看出它作什么。別使用會引起誤解的名字。如果名字一目了然,就無需用文檔來解釋方法的功能了。

    好:
     void SavePhoneNumber ( string phoneNumber )
     {
      // Save the phone number.
     }
    

    不好:
     // This method will save the phone number.
     void SaveData ( string phoneNumber )
     {
      // Save the phone number.
     }
    
  • 一個方法只完成一個任務(wù)。不要把多個任務(wù)組合到一個方法中,即使那些任務(wù)非常小。

    好:
     // 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;
     
  • 別在程序中使用固定數(shù)值,用常量代替。
  • 別用字符串常數(shù)。用資源文件。
  • 避免使用很多成員變量。聲明局部變量,并傳遞給方法。不要在方法間共享成員變量。如果在幾個方法間共享一個成員變量,那就很難知道是哪個方法在什么時候修改了它的值。
  • 必要時使用enum 。別用數(shù)字或字符串來指示離散值。
    好:
     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.
  • 不在代碼中使用具體的路徑和驅(qū)動器名。 使用相對路徑,并使路徑可編程。
  • 永遠別設(shè)想你的代碼是在“C:”盤運行。你不會知道,一些用戶在網(wǎng)絡(luò)或“Z:”盤運行程序。
  • 應(yīng)用程序啟動時作些“自檢”并確保所需文件和附件在指定的位置。必要時檢查數(shù)據(jù)庫連接。出現(xiàn)任何問題給用戶一個友好的提示。
  • 如果需要的配置文件找不到,應(yīng)用程序需能自己創(chuàng)建使用默認(rèn)值的一份。
  • 如果在配置文件中發(fā)現(xiàn)錯誤值,應(yīng)用程序要拋出錯誤,給出提示消息告訴用戶正確值。
  • 錯誤消息需能幫助用戶解決問題。永遠別用象"應(yīng)用程序出錯", "發(fā)現(xiàn)一個錯誤" 等錯誤消息。而應(yīng)給出象 "更新數(shù)據(jù)庫失敗。請確保登陸id和密碼正確。" 的具體消息。  
  • 顯示錯誤消息時,除了說哪里錯了,還應(yīng)提示用戶如何解決問題。不要用 象 "更新數(shù)據(jù)庫失敗。"這樣的,要提示用戶怎么做:"更新數(shù)據(jù)庫失敗。請確保登陸id和密碼正確。"
  • 顯示給用戶的消息要簡短而友好。但要把所有可能的信息都記錄下來,以助診斷問題。

    注釋

  • 別每行代碼,每個聲明的變量都做注釋。
  • 需要的地方注釋?勺x性強的代碼需要很少的注釋。如果所有的變量和方法的命名都很有意義,會使代碼可讀性很強并無需太多注釋。
  • 行數(shù)不多的注釋會使代碼看起來優(yōu)雅。但如果代碼不清晰,可讀性差,那就糟糕。
  • 如果應(yīng)為某種原因使用了復(fù)雜艱澀的原理,為程序配備良好的文檔和重分的注釋。
  • 對一個數(shù)值變量采用不是0,-1等的數(shù)值初始化,給出選擇該值的理由。
  • 簡言之,要寫清晰,可讀的代碼以致無須什么注釋就能理解。
  • 對注釋做拼寫檢查,保證語法和標(biāo)點符號的正確使用。

    異常處理

  • 不要“捕捉了異常卻什么也不做“。如果隱藏了一個異常,你將永遠不知道異常到底發(fā)生了沒有。
  • 發(fā)生異常時,給出友好的消息給用戶,但要精確記錄錯誤的所有可能細(xì)節(jié),包括發(fā)生的時間,和相關(guān)方法,類名等。
  • 只捕捉特定的異常,而不是一般的異常。

    好:
     void ReadFromFile ( string fileName )
     {
      try
      {
       // read from file.
      }
      catch (FileIOException ex)
      {
       // log error.
       //  re-throw exception depending on your case.
       throw;
      }
     }
    
    不好:
     void ReadFromFile ( string fileName )
     {
      try
      {
       // read from file.
      }
      catch (Exception ex) 
      {
       // Catching general exception is bad... we will never know whether it
       // was a file error or some other error.
       
       // Here you are hiding an exception. 
       // In this case no one will ever know that an exception happened.
       return "";  
      }
     }
    
  • 不必在所有方法中捕捉一般異常。不管它,讓程序崩潰。這將幫助你在開發(fā)周期發(fā)現(xiàn)大多數(shù)的錯誤。
  • 你可以用應(yīng)用程序級(線程級)錯誤處理器處理所有一般的異常。遇到”以外的一般性錯誤“時,此錯誤處理器應(yīng)該捕捉異常,給用戶提示消息,在應(yīng)用程序關(guān)閉或 用戶選擇”忽略并繼續(xù)“之前記錄錯誤信息。
  • 不必每個方法都用try-catch。當(dāng)特定的異常可能發(fā)生時才使用。比如,當(dāng)你寫文件時,處理異常FileIOException.
  • 別寫太大的 try-catch 模塊。如果需要,為每個執(zhí)行的任務(wù)編寫單獨的 try-catch 模塊。 這將幫你找出哪一段代碼產(chǎn)生異常,并給用戶發(fā)出特定的錯誤消息
  • 如果應(yīng)用程序需要,可以編寫自己的異常類。自定義異常不應(yīng)從基類SystemException派生,而要繼承于. IApplicationException。


  • 文章來源:dotnetspider.com
     放生
     愚愛
     夠愛
     觸電
     白狐
     葬愛
     光榮
     畫心
     火花
     稻香
     小酒窩
     下雨天
     右手邊
     安靜了
     魔杰座
     你不像她
     邊做邊愛
     擦肩而過
     我的答鈴
     懷念過去
     等一分鐘
     放手去愛
     冰河時代
     你的承諾
     自由飛翔
     原諒我一次
     吻的太逼真
     左眼皮跳跳
     做你的愛人
     一定要愛你
     飛向別人的床
     愛上別人的人
     感動天感動地
     心在跳情在燒
     玫瑰花的葬禮
     有沒有人告訴你
     即使知道要見面
     愛上你是一個錯
     最后一次的溫柔
     愛上你是我的錯
     怎么會狠心傷害我
     不是因為寂寞才想
     親愛的那不是愛情
     難道愛一個人有錯
     寂寞的時候說愛我