程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#編程規范---下

C#編程規范---下

編輯:關於C#

6 第六章 語句

6.1 每行一個語句

每行最多包含一個語句。如

a++; //推薦

b--; //推薦

a++; b--; //不推薦

6.2 復合語句

復合語句是指包含"父語句{子語句;子語句;}"的語句,使用復合語句應遵循以下幾點:

1)子語句要縮進。

2)左花括號“{” 在復合語句父語句的下一行並與之對齊,單獨成行。

3)即使只有一條子語句也不要省略花括號“ {}”。 如

while (d + = s++)
{
  n++;
}

6.3 return 語句

return語句中不使用括號,除非它能使返回值更加清晰。如:

return;

return myDisk.size();

return (size ? size : defaultSize);

6.4 if、 if-else、if else-if 語句

if、 if-else、if else-if 語句使用格式

if (condition)
      {
        statements;
      }
      if (condition)
      {
        statements;
      }
      else
      {
        statements;
      }
      if (condition)
      {
        statements;
      }
      else if (condition)
      {
        statements;
      }
      else
      {
        statements;
      }

6.5 for、foreach 語句

for 語句使用格式

for (initialization; condition; update)
      {
        statements;
      }

空的 for 語句(所有的操作都在initialization、condition 或 update中實現)使用格式

for (initialization; condition; update); // update user id

foreach 語句使用格式

foreach (object obj in array)
       {
         statements;
}

注意 1在循環過程中不要修改循環計數器。

2對每個空循環體給出確認性注釋。

6.6 while 語句

while 語句使用格式

while (condition)
      {
        statements;
      }

空的 while 語句使用格式

while (condition);

6.7 do - while 語句

do - while 語句使用格式

do
       {
         statements;
       } while (condition);

6.8 switch - case 語句

switch - case 語句使用格式

switch (condition)
       {
           case 1:
             statements;
            break;
           case 2:
             statements;
             break;
           default:
             statements;
             break;
         }

注意:

1)語句switch中的每個case各占一行。

2)語句switch中的case按字母順序排列。

3)為所有switch語句提供default分支。

4)所有的非空 case 語句必須用 break; 語句結束。

6.9 try - catch 語句

try - catch 語句使用格式

try
       {
         statements;
       }
       catch (ExceptionClass e)
       {
         statements;
       }
       finally
       {
        statements;
       }

6.10using 塊語句

using 塊語句使用格式

using (object)
       {
         statements;
       }

7 控件命名規則

7.1   命名方法

控件名簡寫+英文描述,英文描述首字母大寫。

7.2 主要控件名簡寫對照表

控件名 簡寫  控件名 簡寫 Label  lbl TextBox   txt Button btn LinkButton lnkbtn ImageButton imgbtn  DropDownList ddl ListBox lst DataGrid dg DataList dl  CheckBox chk CheckBoxList chkls RadioButton rdo RadioButtonList rdolt  Image img Panel  pnl Calender cld AdRotator ar Table tbl RequiredFieldValidator rfv CompareValidator cv RangeValidator rv  RegularExpressionValidator rev ValidatorSummary     vs  CrystalReportViewer rptvew

8 程序結構

8.1 程序結構規范

1)程序結構清晰,簡單易懂,單個函數的程序行數不得超過100行。避免使用大文件。如果一個文件裡的代碼超過300~400行,必須考慮將代碼分開到不同類中。避免寫太長的方法。一個典型的方法代碼在1~25行之間。如果一個方法發代碼超過25行,應該考慮將其分解為不同的方法。一個文件應避免超過2000行。

2)打算干什麼,要簡單,直截了當,代碼精簡,避免垃圾程序。

3)盡量使用.NET庫函數和公共函數(無特殊情況不要使用外部方法調用windows的核心動態鏈接庫API)。

4)不要隨意定義全局變量,盡量使用局部變量。

5)方法名需能看出它作什麼。別使用會引起誤解的名字。如果名字一目了然,就無需用文檔來解釋方法的功能了。

好:

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

不好:

// This method will save the phone number.
void SaveData ( string phoneNumber )
{
  // Save the phone number.
}

6)程序編碼力求簡潔,結構清晰,避免太多的分支結構及太過於技巧性的程序。

7)避免采用過於復雜的條件測試,避免過多的循環嵌套和條件嵌套。

8)盡量使用.NET庫函數和公共函數(無特殊情況不要使用外部方法調用windows的核心動態鏈接庫API)。

9)不要隨意定義全局變量,聲明局部變量,並傳遞給方法。不要在方法間共享成員變量。如果在幾個方法間共享一個成員變量,那就很難知道是哪個方法在什麼時候修改了它的值。

10)別在程序中使用固定數值,用常量代替。

8.2 結構書寫規范

1)把所有系統框架提供的名稱空間組織到一起,把第三方提供的名稱空間放到系統名稱空間的下面

using System;
using System.Collection.Generic;
using System.ComponentModel;
using System.Data;
using MyCompany;
using MyControls;

2)所有的類成員變量應該被聲明在類的頂部,並用一個空行把它們和方法以及屬性的聲明區分開

public class MyClass 
{
int m_Number;
string m_Name;
public void SomeMethod1();
public void SomeMethod2();
}

3)避免采用多賦值語句,如x = y = z;。

4)必要時使用enum 。別用數字或字符串來指示離散值。

好:

enum MailType
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;
  }
}

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

好:

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.
 // ...
}

不好:

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.
 // ...
}

6)使用括號清晰地表達算術表達式和邏輯表達式的運算順序。如將 x=a*b/c*d 寫成 x=(a*b/c)*d可避免閱讀者誤解為x=(a*b)/(c*d)。

7)總是使用以零為基數的數組。

8)把引用的系統的namespace和自定義或第三方的用一個換行把它們分開.

9)目錄結構中要反應出namespace的層次.

9 異常處理

9.1 異常處理

1)不要“捕捉了異常卻什麼也不做”。如果隱藏了一個異常,你將永遠不知道異常到底發生了沒有。

2)發生異常時,給出友好的消息給用戶,但要精確記錄錯誤的所有可能細節,包括發生的時間,和相關方法,類名等。

3)不必每個方法都用try-catch。當特定的異常可能發生時才使用。比如,當你寫文件時,處理異常FileIOException.

4)別寫太大的 try-catch 模塊。如果需要,為每個執行的任務編寫單獨的 try-catch 模塊。 這將幫你找出哪一段代碼產生異常,並給用戶發出特定的錯誤消息。

5)只捕捉特定的異常,而不是一般的異常。

好:

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 "";
  }
}

不必在所有方法中捕捉一般異常。不管它,讓程序崩潰。這將幫助你在開發周期發現大多數的錯誤。

6)避免利用返回值作為函數的錯誤代碼,應該在程序中使用異常來處理錯誤。

10 其他

10.1類型轉換

1)盡量避免強制類型轉換。

2)如果不得不做類型轉換,盡量使用as關鍵字安全的轉換到另一個類型。

Dog dog=new GermanShepherd();
GermanShepherd shepherd=dog as GermanShepherd;
if (shepherd!=null)
{…}

10.2正確性與容錯性要求

1)程序首先是正確,其次是優美

2)無法證明你的程序沒有錯誤,因此在編寫完一段程序後,應先回頭檢查。

3)改一個錯誤時可能產生新的錯誤,因此在修改前首先考慮對其它程序的影響。

4)對所有的用戶輸入,必須進行合法性檢查。---www.bianceng.cn。

5)盡量不要比較浮點數的相等,如: 10.0 * 0.1 == 1.0 , 不可靠

6)程序與環境或狀態發生關系時,必須主動去處理發生的意外事件,如文件能否邏輯鎖定、打印機是否聯機等,對於明確的錯誤,要有明確的容錯代碼提示用戶,在這樣不確定的場合都使用Try Throw Catch。

7)單元測試也是編程的一部份,提交聯調測試的程序必須通過單元測試。

10.3可重用性要求

1)重復使用的完成相對獨立功能的算法或代碼應抽象為asp.net服務或類。

2)asp.net服務或類應考慮OO思想,減少外界聯系,考慮獨立性或封裝性。

3)避免讓你的代碼依賴於運行在某個特定地方的程序集。

10.4其他

1)不要手動去修改任何機器生成的代碼

a) 如果修改了機器生成的代碼,修改你的編碼方式來適應這個編碼標准

b) 盡可能使用partial classes特性,以提高可維護性。(C#2.0新特性)

2)避免在一個程序集中(assembly)中定義多個Main()方法。

3)只把那些絕對需要的方法定義成public,而其它的方法定義成internal。

4)避免使用三元條件操作符。

5)除非為了和其它語言進行互動,否則絕不要使用不安(unsafe)的代碼。

6)接口和類中方法和屬性的比應該在2:1左右。

7)努力保證一個接口有3~5個成員。

8)避免在結構中提供方法

a) 參數化的構造函數是鼓勵使用的

b) 可以重載運行符

9)當早綁定(early-binding)可能的時候就盡量不要使用遲綁定(late-binding)。

10)除了在一個構造函數中調用其它的構造函數之外,不要使用this關鍵字。

//Example of proper use of ‘this’
public class MyClass 
{
public MyClass(string message)
{  }
public MyClass():this(“Hello”)
{  }
}

11)不要使用base關鍵字訪問基類的成員,除非你在調用一個基類構造函數的時候要解決一個子類的名稱沖突

//Example of proper use of ‘base’
public class Dog
{
public Dog(string name)
{ }
virtual public void Bark(int howlong)
{  }
}
public class GermanShepherd:Dog
{
public GermanShepherd(string name):base(name)
{  }
override public void Bark(int howLong)
{
base.Bark(howLong)
}
}

12)生成和構建一個長的字符串時,一定要使用StringBuilder,而不用string。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved