C#編碼標(biāo)準(zhǔn)
1.利用Pascal的方式定義類型、方法名和常量
{
const int DefaultSize = 100;
public SomeMethod()
{
}
}
void MyMethod(int someNumber)
{}
4. 在私有成員變量前面加上m_。對(duì)于m_后面的變量名使用駱駝命名法
{
private int m_Number;
}
6. 對(duì)自定義的異常類加上后綴Exception
7. 方法的命名使用動(dòng)詞——對(duì)象對(duì)。例如ShowDialog()
8. 有返回值的方法的命名中要有對(duì)返回值的描述。例如GetObjectState()
9. 使用帶有說明性的變量名
a)避免單字符的變量名。例如i或t。使用類似于index或temp這樣有意義的名字。
b)對(duì)于public或protected類型的變量避免使用匈牙利表示法
c)不要所寫單詞(例如用num取代number)
10. 總是使用c#預(yù)定義的類型而不是使用在System命名空間中的別名。例如:
使用object而不是Object
使用string 而不是String
使用int而不是Int32
11. 在使用泛型的時(shí)候,類型的首字母要大寫。當(dāng)處理.NET中的Type類型的時(shí)候,保留Type后綴。
12. 使用有意義的名字定義命名空間。例如產(chǎn)品名或者公司名
13. 避免通過全限定方式使用類型名稱,使用using關(guān)鍵字。
14. 避免在一個(gè)命名空間中使用using關(guān)鍵字
15. 把所有系統(tǒng)框架提供的命名空間組織到一起,把第三方提供的命名空間放到系統(tǒng)命名空間的下面
16. 使用代理推導(dǎo)而不要顯示的實(shí)例化一個(gè)代理
17. 維護(hù)嚴(yán)格的代碼縮進(jìn)。不要使用tabs或非標(biāo)準(zhǔn)的縮進(jìn),例如一個(gè)空格。推薦的縮進(jìn)市3到4個(gè)空格。
18. 在和你的代碼縮進(jìn)處于同一個(gè)級(jí)別處為該代碼添加注釋
19. 所有的注釋都應(yīng)該通過拼寫檢查。注釋中的錯(cuò)誤拼寫意味著開發(fā)進(jìn)度的延緩
20. 所有類成員變量應(yīng)該被聲明在類的頂部,并用一個(gè)空行把他們和方法以及屬性的聲明區(qū)分開
21. 在最靠近一個(gè)局部變量被使用的地方聲明該局部變量
22. 一個(gè)文件名應(yīng)該能夠反映它所對(duì)應(yīng)的類名
23. 當(dāng)使用一個(gè)部分類并把該類分布到不同的文件中時(shí),在每一個(gè)文件名末尾都加上該文件實(shí)現(xiàn)的部分在類整體中扮演的作用。
24. 總是要把“{”放在新的一行。
編碼實(shí)踐
1. 避免在同一個(gè)文件中放置多個(gè)類
2. 一個(gè)文件應(yīng)該只向在一個(gè)命名空間內(nèi)定義類型。避免在一個(gè)文件中使用多個(gè)命名空間
3. 避免在一個(gè)文件內(nèi)些多余500行的代碼
4. 避免寫超過25行代碼的方法
5. 避免寫超過5個(gè)參數(shù)的方法。如果要傳遞多個(gè)參數(shù),使用結(jié)構(gòu)
6. 一行不要超過80字符
7. 不要手動(dòng)去修改任何機(jī)器生成的代碼
a)如果修改了機(jī)器生成的代碼,修改你的編碼方式來死適應(yīng)這個(gè)編碼標(biāo)準(zhǔn)
b)盡可能使用partial classes特性,以提高可維護(hù)性
8. 避免對(duì)那些直觀的內(nèi)容作注釋。代碼本身應(yīng)該能夠解釋其自身的含義。由可讀的變量名和方法名構(gòu)成的優(yōu)質(zhì)代碼應(yīng)該不需要注釋。
9. 注釋應(yīng)該只說明操作的一些前提假設(shè)、算法的內(nèi)部信息等內(nèi)容。
10. 避免對(duì)方法進(jìn)行注釋
a)使用充足的外部文檔對(duì)API進(jìn)行說明
b)只有對(duì)那些其他開發(fā)者的提示信息才有必要放到方法級(jí)的注釋中來
11. 除了0和1,絕對(duì)不要對(duì)數(shù)值進(jìn)行硬編碼,通過聲明一個(gè)常量來代替該數(shù)值
12. 只對(duì)那些亙古不變的數(shù)值使用const關(guān)鍵字,例如一周的天數(shù)
13. 避免對(duì)只讀(read-only)的變量使用const關(guān)鍵字。
14. 對(duì)每一個(gè)假設(shè)進(jìn)行斷言。平均起來,每5行應(yīng)有一個(gè)斷言。
15. 每一行代碼都應(yīng)該以白盒測(cè)試的方式進(jìn)行審讀。
16. 只捕捉那些你自己能夠顯示處理的異常
17. 如果在catch語句塊中需要拋出異常,則只拋出該catch所捕捉到的異常(或基于該異常而創(chuàng)建的其他異常),這樣可以維護(hù)原始錯(cuò)誤所在的堆棧位置。
{
MessageBox.Show(exception.Message);
throw;//或throw exception;
}
19. 避免自定義異常類
20. 當(dāng)自定義異常類的時(shí)候
a)讓你自定義的異常類從Exception類繼承
b)提供自定義的串行化機(jī)制
21. 避免在一個(gè)程序集中定義多個(gè)Main()方法
22. 只把那些絕對(duì)需要的方法定義成public,而其他的方法定義成internal
23. 避免friend assermblies,因?yàn)檫@回增加程序集之間的耦合性
24. 避免讓你的代碼依賴于運(yùn)行在某個(gè)特定地方的程序集
25. 在application assembly中最小化代碼量。使用類庫來包含業(yè)務(wù)邏輯
26. 避免顯示指定枚舉的值
public enum Color
{
Red,Green,Blue
}
//錯(cuò)誤
public enum Color
{
Red=1,Green=2,Blue=3
}
public enum Color:long
{
Red,Green,Blue
}
29. 避免使用三元條件操作符
30. 避免利用函數(shù)返回的Boolean值作為條件語句。把返回值賦給一個(gè)局部變量,然后再檢測(cè)
31. 總是使用以零為基數(shù)的數(shù)組
32. 總是使用一個(gè)for循環(huán)顯示的初始化一個(gè)引用成員的數(shù)組
33. 使用屬性來替代public或protected類型的成員變量
34. 不要使用繼承下來的new操作符,使用override關(guān)鍵字覆寫new的實(shí)現(xiàn)
35. 在一個(gè)非密封(non-sealed)類中,總是把那些public和protected的方法定義為virtual
36. 除非為了和其他語音進(jìn)行互動(dòng),否則絕對(duì)不要使用不安全的代碼
37. 避免顯示類型轉(zhuǎn)換。使用as關(guān)鍵字安全的轉(zhuǎn)換到另一個(gè)類型
GermanShepherd shepherd = dog as GermanShepherd;
if(shepherd != null)
{}
39. 不要提供public的事件成員變量。改用Event Accessor
40. 總是使用接口
41. 接口和類中方法和屬性的比應(yīng)該在2:1左右
42. 避免只有一個(gè)成員的接口
43. 努力保證一個(gè)接口有3~5個(gè)成員
44. 不要讓一個(gè)接口中成員的數(shù)量超過20,而12則是更為實(shí)際的限制。
45. 避免在接口中包含事件
46. 當(dāng)使用抽象類的時(shí)候,提供一個(gè)接口
47. 在類繼承結(jié)構(gòu)中暴露接口
48. 推薦使用顯示接口實(shí)現(xiàn)
49. 從來不要假設(shè)一個(gè)類型支持某個(gè)接口。在使用前總是要詢問一下。
IMyInterface obj2;
//Some code to initialize,then:
obj2 = obj1 as IMyInterface;
if(obj2 != null)
{
obj2.Method();
}
else
{
//handle error in expected interface
}
50.不要硬編碼向用戶顯示的字符串。要使用資源
51. 不要硬編碼那些可能會(huì)隨發(fā)布環(huán)境變化而變化的字符串,例如數(shù)據(jù)庫連接字符串
52. 使用String.Empty取代""
53. 使用一個(gè)長(zhǎng)字符串的時(shí)候,使用StringBuilder代替string
54. 避免在結(jié)構(gòu)中提供方法a)參數(shù)化的構(gòu)造函數(shù)是鼓勵(lì)使用的b)可以重載運(yùn)算符
55. 當(dāng)聲明了靜態(tài)成員的時(shí)候,總是要提供一個(gè)靜態(tài)構(gòu)造函數(shù)
56. 當(dāng)早綁定可能的時(shí)候就盡量不要使用遲綁定
57. 讓你的應(yīng)用程序支持跟蹤和日志
58. 除了要在switch語句中實(shí)現(xiàn)代碼跳轉(zhuǎn),不要使用goto關(guān)鍵字
59. 總在switch語句的default情形提供一個(gè)斷言
switch(number)
{
case 1:
Trace.WriteLine("case 1:");
break;
case 2:
Trace.WriteLine("case 2:");
break;
default:
Debug.Assert(false)
break;
}
60. 除了在一個(gè)構(gòu)造函數(shù)中調(diào)用其他的構(gòu)造函數(shù)之外,不要使用this關(guān)鍵字
61. 不要使用base訪問基類的成員,除非你在調(diào)用一個(gè)基類構(gòu)造函數(shù)的時(shí)候要決議一個(gè)子類的名稱沖突
62. 總是要在unchecked狀態(tài)下運(yùn)行代碼,但是為了防止溢出或下溢操作,要果斷使用checked模式
項(xiàng)目設(shè)置和項(xiàng)目結(jié)構(gòu)
1. 總是在4級(jí)警告上建立你的項(xiàng)目
2. 在發(fā)布版中,把警告當(dāng)成錯(cuò)誤來對(duì)待
3. 避免關(guān)閉編譯器的某些警告選項(xiàng)
4. 總是要在應(yīng)用程序的配置文件中顯示指定支持的運(yùn)行時(shí)版本
5. 避免顯示進(jìn)行CLR程序集版本的重定向和綁定
6. 避免顯示的預(yù)處理定義(#define)。使用項(xiàng)目設(shè)置來定義條件編譯常量
7. 不要在AssemblyInfo.cs中加入任何邏輯
8. 不要在AssemblyInfo.cs之外的文件中添加程序級(jí)屬性。
9. 提供AssemblyInfo.cs中的所有信息,例如公司名、描述和版權(quán)事項(xiàng)等
10. 同一個(gè)解決方案中的程序集引用都應(yīng)該使用相同路徑
11. 禁止在程序集之間使用循環(huán)引用
12. 避免多模塊程序集
13. 避免利用異常窗口削弱異常處理
14. 堅(jiān)持在同一個(gè)解決方案中的所有程序集之間使用統(tǒng)一的版本號(hào)
15. 把所有解決方案的信息存放到一個(gè)共享的SolutionInfo.cs文件中
16. 把你的應(yīng)用程序的配置文件命名為App.config,并把它包含在你的項(xiàng)目中
17. 修改Visual Studio 2005 的默認(rèn)項(xiàng)目結(jié)構(gòu)來適應(yīng)你的項(xiàng)目規(guī)劃,并且對(duì)項(xiàng)目文件夾和文件使用統(tǒng)一的結(jié)構(gòu)
18. 一個(gè)Release發(fā)布應(yīng)該包含調(diào)試信息
19. 總是對(duì)你的程序集進(jìn)行簽名,包括你的客戶應(yīng)用程序
轉(zhuǎn)載請(qǐng)注明來自杭州安米通儀器設(shè)備有限公司,本文標(biāo)題:《C#編碼標(biāo)準(zhǔn)》
還沒有評(píng)論,來說兩句吧...