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

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

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

命名慣例和規(guī)范



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

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

  • 文件名要和類名匹配

    例如,對(duì)于類HelloWorld, 相應(yīng)的文件名應(yīng)為 helloworld.cs (或, helloworld.vb)

    縮進(jìn)和間隔

  • 縮進(jìn)用 TAB . 不用 SPACES.。
  • 注釋需和代碼對(duì)齊.。
  • 花括弧 ( {} ) 需和括號(hào)外的代碼對(duì)齊.。
  • 用一個(gè)空行來分開代碼的邏輯分組。.
     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; }
  • 在一個(gè)類中,各個(gè)方法需用一空行,也只能是一行分開。
  • 花括弧需獨(dú)立一行,而不象if, for 等可以跟括號(hào)在同一行。.
    好:
      if ( ... ) 
      {
       // Do something
      }
    
    不好:
      if ( ... ) {
       // Do something
      }
    
  • 在每個(gè)運(yùn)算符和括號(hào)的前后都空一格。.

    好:
      if ( showResult == true )
      {
       for ( int i = 0; i < 10; i++ )
       {
        //
       }
      }
    
    不好:
      if(showResult==true)
      {
       for(int i= 0;i<10;i++)
       {
        //
       }
      }
    

    良好的編程習(xí)慣


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

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

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

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

    注釋

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

    異常處理

  • 不要“捕捉了異常卻什么也不做“。如果隱藏了一個(gè)異常,你將永遠(yuǎn)不知道異常到底發(fā)生了沒有。
  • 發(fā)生異常時(shí),給出友好的消息給用戶,但要精確記錄錯(cuò)誤的所有可能細(xì)節(jié),包括發(fā)生的時(shí)間,和相關(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ù)的錯(cuò)誤。
  • 你可以用應(yīng)用程序級(jí)(線程級(jí))錯(cuò)誤處理器處理所有一般的異常。遇到”以外的一般性錯(cuò)誤“時(shí),此錯(cuò)誤處理器應(yīng)該捕捉異常,給用戶提示消息,在應(yīng)用程序關(guān)閉或 用戶選擇”忽略并繼續(xù)“之前記錄錯(cuò)誤信息。
  • 不必每個(gè)方法都用try-catch。當(dāng)特定的異?赡馨l(fā)生時(shí)才使用。比如,當(dāng)你寫文件時(shí),處理異常FileIOException.
  • 別寫太大的 try-catch 模塊。如果需要,為每個(gè)執(zhí)行的任務(wù)編寫單獨(dú)的 try-catch 模塊。 這將幫你找出哪一段代碼產(chǎn)生異常,并給用戶發(fā)出特定的錯(cuò)誤消息
  • 如果應(yīng)用程序需要,可以編寫自己的異常類。自定義異常不應(yīng)從基類SystemException派生,而要繼承于. IApplicationException。


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