实用C#编程规范(转载)
1?概述
1.1?規(guī)范制定原則
1)?方便代碼的交流和維護(hù)。
2)?不影響編碼的效率,不與大眾習(xí)慣沖突。
3)?使代碼更美觀、閱讀更方便。
4)?使代碼的邏輯更清晰、更易于理解。
1.2?術(shù)語定義
1)?Pascal?大小寫
??????將標(biāo)識符的首字母和后面連接的每個單詞的首字母都大寫。可以對三字符或更多字符的標(biāo)識符使用Pascal?大小寫。例
BackColor
2)?Camel?大小寫
??????標(biāo)識符的首字母小寫,而每個后面連接的單詞的首字母都大寫。例如:
?????backColor
1.3?文件命名組織
1.3.1?文件命名
1)?文件名遵從Pascal命名法,無特殊情況,擴(kuò)展名小寫。
2)?使用統(tǒng)一而又通用的文件擴(kuò)展名:?C#?類??.cs
1.3.2?文件注釋
1)?在每個文件頭必須包含以下注釋說明
????????????/*----------------------------------------------------------------
????????????//?Copyright?(C)?公司名稱
????????????//?版權(quán)所有。?
????????????//
????????????//?文件名:
????????????//?文件功能描述:
????????????//
????????????//?
????????????//?創(chuàng)建標(biāo)識:
????????????//
????????????//?修改標(biāo)識:
????????????//?修改描述:
????????????//
????????????//?修改標(biāo)識:
????????????//?修改描述:
//----------------------------------------------------------------*/
2)?文件功能描述只需簡述,具體詳情在類的注釋中描述。
3)?創(chuàng)建標(biāo)識和修改標(biāo)識由創(chuàng)建或修改人員的拼音或英文名加日期組成。如:
????姚明20040408
4)?一天內(nèi)有多個修改的只需做一個在注釋說明中做一個修改標(biāo)識就夠了。
5)?在所有的代碼修改處加上修改標(biāo)識的注釋。
2?代碼外觀
2.1?列寬
????代碼列寬控制在110字符左右,原則上不超過屏寬。
2.2?換行
??????當(dāng)表達(dá)式超出或即將超出規(guī)定的列寬,遵循以下規(guī)則進(jìn)行換行:
??????????1、在逗號,括號后換行。
??????????2、?在操作符前換行。
??????????3、規(guī)則1優(yōu)先于規(guī)則2。
?????當(dāng)以上規(guī)則會導(dǎo)致代碼混亂的時候自己采取更靈活的換行規(guī)則。?????
2.3?縮進(jìn)?
?????縮進(jìn)應(yīng)該是每行一個Tab(4個空格),不要在代碼中使用Tab字符。
??Visual?Studio.Net設(shè)置:工具->選項(xiàng)->文本編輯器->C#->制表符->插入空格
2.4?空行
空行是為了將邏輯上相關(guān)聯(lián)的代碼分塊,以便提高代碼的可閱讀性。
在以下情況下使用兩個空行:
???1、接口和類的定義之間。
???2、枚舉和類的定義之間。
???3、類與類的定義之間。??????
在以下情況下使用一個空行:
1、方法與方法、屬性與屬性之間。
2、方法中變量聲明與語句之間。
3、方法與方法之間。
4、方法中不同的邏輯塊之間。
5、方法中的返回語句與其他的語句之間。
6、屬性與方法、屬性與字段、方法與字段之間。
7、注釋與它注釋的語句間不空行,但與其他的語句間空一行。
8、文件之中不得存在無規(guī)則的空行,比如說連續(xù)十個空行。空行是為了將邏輯上相關(guān)聯(lián)的代碼分塊,以便提高代碼的可閱讀性。
2.5?空格
在以下情況中要使用到空格:
1、?關(guān)鍵字和左括符?“(”?應(yīng)該用空格隔開。如
???????????while?(true)????
????????注意在方法名和左括符?“(”?之間不要使用空格,這樣有助于辨認(rèn)代碼中的方法調(diào)用與關(guān)鍵字。
2、???多個參數(shù)用逗號隔開,每個逗號后都應(yīng)加一個空格。
3、???除了?.?之外,所有的二元操作符都應(yīng)用空格與它們的操作數(shù)隔開。一元操作符、++及--與操作????數(shù)間不需要空格。如
???????????a??+=??c??+??d;
???????????a??=??(a??+??b)???/???(c??*??d);
????????????while??(d++??=??s++)
????????????{
????????????????????n++;
????????????}
????????????PrintSize(“size?is?“??+??size??+??“\n”);
4、?語句中的表達(dá)式之間用空格隔開。如
for??(expr1;??expr2;??expr3)
2.6?花括號?-?{}
1、?左花括號?“{”?放于關(guān)鍵字或方法名的下一行并與之對齊。如
?????????????if?(condition)
?????????????{
?????????????}
?????????????public?int?Add(int?x,?int?y)
?????????????{
?????????????}
2、左花括號?“{”?要與相應(yīng)的右花括號?“}”對齊。
3、?通常情況下左花括號?“{”單獨(dú)成行,不與任何語句并列一行。
4、?if、while、do語句后一定要使用{},即使{}號中為空或只有一條語句。如
?????????????if?(somevalue?==?1)
?????????????{
?????????????????somevalue?=?2;
?????????????}
5、?右花括號?“}”?后建議加一個注釋以便于方便的找到與之相應(yīng)的?{。如
???????????????while??(1)
???????????????{
???????????????????if??(valid)
???????????????????{
???????????????????}?//?if?valid
???????????????????else
???????????????????{
???????????????????}?//?not?valid
????????????????}?//?end?forever
3?程序注釋
3.1?注釋概述
1)?修改代碼時,總是使代碼周圍的注釋保持最新。
2)?在每個例程的開始,提供標(biāo)準(zhǔn)的注釋樣本以指示例程的用途、假設(shè)和限制很有幫助。注釋樣本應(yīng)該是解釋它為什么存在和可以做什么的簡短介紹.
3)?避免在代碼行的末尾添加注釋;行尾注釋使代碼更難閱讀。不過在批注變量聲明時,行尾注釋是合適的;在這種情況下,將所有行尾注釋在公共制表位處對齊。?
4)?避免雜亂的注釋,如一整行星號。而是應(yīng)該使用空白將注釋同代碼分開。?
5)?在部署發(fā)布之前,移除所有臨時或無關(guān)的注釋,以避免在日后的維護(hù)工作中產(chǎn)生混亂。
6)?如果需要用注釋來解釋復(fù)雜的代碼節(jié),請檢查此代碼以確定是否應(yīng)該重寫它。盡一切可能不注釋難以理解的代碼,而應(yīng)該重寫它。盡管一般不應(yīng)該為了使代碼更簡單以便于人們使用而犧牲性能,但必須保持性能和可維護(hù)性之間的平衡。
7)?在編寫注釋時使用完整的句子。注釋應(yīng)該闡明代碼,而不應(yīng)該增加多義性。?
8)?在編寫代碼時就注釋,因?yàn)橐院蠛芸赡軟]有時間這樣做。另外,如果有機(jī)會復(fù)查已編寫的代碼,在今天看來很明顯的東西六周以后或許就不明顯了。
9)?避免多余的或不適當(dāng)?shù)淖⑨?#xff0c;如幽默的不主要的備注。
10)?使用注釋來解釋代碼的意圖。它們不應(yīng)作為代碼的聯(lián)機(jī)翻譯。?
11)?注釋代碼中不十分明顯的任何內(nèi)容。
12)?為了防止問題反復(fù)出現(xiàn),對錯誤修復(fù)和解決方法代碼總是使用注釋。
13)?對由循環(huán)和邏輯分支組成的代碼使用注釋。這些是幫助源代碼讀者的主要方面。?
14)?在整個應(yīng)用程序中,使用具有一致的標(biāo)點(diǎn)和結(jié)構(gòu)的統(tǒng)一樣式來構(gòu)造注釋。?
15)?在所有的代碼修改處加上修改標(biāo)示的注釋。
16)?為了是層次清晰,在閉合的右花括號后注釋該閉合所對應(yīng)的起點(diǎn)。
????namespace?Langchao.Procument.Web?
{
}?//?namespace?Langchao.Procument.Web
3.2?文檔型注釋
該類注釋采用.Net已定義好的Xml標(biāo)簽來標(biāo)記,在聲明接口、類、方法、屬性、字段都應(yīng)該使用該類注釋,以便代碼完成后直接生成代碼文檔,讓別人更好的了解代碼的實(shí)現(xiàn)和接口。如
///<summary>MyMethod?is?a?method?in?the?MyClass?class.
///<para>Here's?how?you?could?make?a?second?paragraph?in?a?description.
///<see?cref="System.Console.WriteLine"/>?
///for?information?about?output?statements.
///</para>
????????????///<seealso?cref="MyClass.Main"/>
????????????///</summary>
???public?static?void?MyMethod(int?Int1)
???{
???????????}
3.3?類c注釋
該類注釋用于
1)?不再使用的代碼。
2)?臨時測試屏蔽某些代碼。
用法
?????????/*
[修改標(biāo)識]
[修改原因]
.?.?.?(the?source?code?)
*/
3.4?單行注釋
該類注釋用于
1)?方法內(nèi)的代碼注釋。如變量的聲明、代碼或代碼段的解釋。注釋示例:
??????????//
//?注釋語句
??????????//?
?????????private?int?number;
或
?????????//?注釋語句
?????????private?int?number;
2)?方法內(nèi)變量的聲明或花括號后的注釋,?注釋示例:
???????????????if?(?1?==?1)????//?always?true
???????????????{????
??????????????????statement;?
?????????????????}?//?always?true
4?申明
4.1?每行聲明數(shù)
一行只建議作一個聲明,并按字母順序排列。如:
??????????int?level;???//推薦
??????????int?size;????//推薦
??????????int?x,?y;????//不推薦
4.2?初始化
建議在變量聲明時就對其做初始化。????????
4.3?位置
變量建議置于塊的開始處,不要總是在第一次使用它們的地方做聲明。如:
?????????void?MyMethod()
??????????{
??????????????int?int1?=?0;?????????//?beginning?of?method?block
if?(condition)
{
??????????????????int?int2?=?0;?????//?beginning?of?"if"?block
??????????????????...
??????????????}
??????????}
不過也有一個例外:
????????????????for?(int?i?=?0;?i?<?maxLoops;?i++)
????????????????{
????????????????????...
????????????????}
應(yīng)避免不同層次間的變量重名,如:
????????????int?count;
????????????...
void?MyMethod()
{
????????????????if?(condition)
????????????????{
????????????????????int?count?=?0;?????//?避免
?????????????????????...
?????????????????}
?????????????????...
}
4.4?類和接口的聲明
1)?在方法名與其后的左括號間沒有任何空格。
2)?左花括號?“{”?出現(xiàn)在聲明的下行并與之對齊,單獨(dú)成行。
3)?方法間用一個空行隔開。??
4.5?字段的聲明
不要使用是?public?或?protected?的實(shí)例字段。如果避免將字段直接公開給開發(fā)人員,可以更輕松地對類進(jìn)行版本控制,原因是在維護(hù)二進(jìn)制兼容性時字段不能被更改為屬性。考慮為字段提供?get?和set?屬性訪問器,而不是使它們成為公共的。?get?和?set?屬性訪問器中可執(zhí)行代碼的存在使得可以進(jìn)行后續(xù)改進(jìn),如在使用屬性或者得到屬性更改通知時根據(jù)需要創(chuàng)建對象。下面的代碼示例闡釋帶有g(shù)et?和?set?屬性訪問器的私有實(shí)例字段的正確使用。示例:
????????????public?class?Control:?Component
????????????{
???????????????private?int?handle;
???????????????public??int?Handle
???????????????{
??????????????????get
??????????????????{?
?????????????????????return?handle;?
??????????????????}
???????????????}
}
?
5?第五章 命名規(guī)范
5.1?命名概述
名稱應(yīng)該說明“什么”而不是“如何”。通過避免使用公開基礎(chǔ)實(shí)現(xiàn)(它們會發(fā)生改變)的名稱,可以保留簡化復(fù)雜性的抽象層。例如,可以使用?GetNextStudent(),而不是?GetNextArrayElement()。?
命名原則是:
選擇正確名稱時的困難可能表明需要進(jìn)一步分析或定義項(xiàng)的目的。使名稱足夠長以便有一定的意義,并且足夠短以避免冗長。唯一名稱在編程上僅用于將各項(xiàng)區(qū)分開。表現(xiàn)力強(qiáng)的名稱是為了幫助人們閱讀;因此,提供人們可以理解的名稱是有意義的。其實(shí)從長變量名的負(fù)面作用三,因?yàn)镃trl+C和Ctrl+V加上在VS中的智能感知,其負(fù)面追用已經(jīng)很小。最優(yōu)秀的代碼它本身就是注釋。作為一流的程序員。并不僅僅實(shí)現(xiàn)功能,而是要讓我們的代碼更加優(yōu)美,具備讓他人維護(hù)或今后擴(kuò)充的能力。作為現(xiàn)在的業(yè)務(wù)系統(tǒng),其門檻的準(zhǔn)入水平已大大降低,實(shí)現(xiàn)功能上的需求已沒有什么難度,但是高手和菜鳥的區(qū)別在于,高手的代碼通俗易懂,在整個編碼的過程中,不僅能考慮到性能、還會考慮代碼可讀性和維護(hù)性。不過,請確保選擇的名稱符合適用語言的規(guī)則和標(biāo)準(zhǔn)。
以下幾點(diǎn)是推薦的命名方法。
1)?避免容易被主觀解釋的難懂的名稱,如命名?AnalyzeThis(),或者屬性名?xxK8。這樣的名稱會導(dǎo)致多義性。
2)?在類屬性的名稱中包含類名是多余的,如?Book.BookTitle。而是應(yīng)該使用?Book.Title。
3)?只要合適,在變量名的末尾或開頭加計(jì)算限定符(Avg、Sum、Min、Max、Index)。
4)?在變量名中使用互補(bǔ)對,如?min/max、begin/end?和?open/close。?
5)?布爾變量名應(yīng)該包含?Is,這意味著?Yes/No?或?True/False?值,如?fileIsFound。
6)?在命名狀態(tài)變量時,避免使用諸如?Flag?的術(shù)語。狀態(tài)變量不同于布爾變量的地方是它可以具有兩個以上的可能值。不是使用?documentFlag,而是使用更具描述性的名稱,如?documentFormatType。?(此項(xiàng)只供參考)
7)?即使對于可能僅出現(xiàn)在幾個代碼行中的生存期很短的變量,仍然使用有意義的名稱。僅對于短循環(huán)索引使用單字母變量名,如?i?或?j。?可能的情況下,盡量不要使用原義數(shù)字或原義字符串,如
????For?i?=?1?To?7。而是使用命名常數(shù),如?For?i?=?1?To?NUM_DAYS_IN_WEEK?以便于維護(hù)和理解。
8)?文件名要和類名相同,一般情況下一個類一個文件。
5.2?大小寫規(guī)則
下表匯總了大寫規(guī)則,并提供了不同類型的標(biāo)識符的示例。
| 標(biāo)識符 | 大小寫 | 示例 |
| 類 | Pascal | AppDomain |
| 枚舉類型 | Pascal | ErrorLevel |
| 枚舉值 | Pascal | FatalError |
| 事件 | Pascal | ValueChange |
| 異常類 | Pascal | WebException? 注意?總是以?Exception?后綴結(jié)尾。 |
| 只讀的靜態(tài)字段 | Pascal | RedValue |
| 接口 | Pascal | IDisposable? 注意?總是以?I?前綴開始。 |
| 方法 | Pascal | ToString |
| 命名空間 | Pascal | System.Drawing |
| 屬性 | Pascal | BackColor |
| 公共實(shí)例字段 | Pascal | RedValue? 注意?很少使用。屬性優(yōu)于使用公共實(shí)例字段。 |
| 受保護(hù)的實(shí)例字段 | Camel? | redValue? 注意?很少使用。屬性優(yōu)于使用受保護(hù)的實(shí)例字段。 |
| 私有的實(shí)例字段 | Camel | redValue |
| 參數(shù) | Camel | typeName |
| 方法內(nèi)的變量 | Camel | backColor |
5.3?縮寫
為了避免混淆和保證跨語言交互操作,請遵循有關(guān)區(qū)縮寫的使用的下列規(guī)則:?
1)?不要將縮寫或縮略形式用作標(biāo)識符名稱的組成部分。例如,使用?GetWindow,而不要使用?GetWin。?
2)?不要使用計(jì)算機(jī)領(lǐng)域中未被普遍接受的縮寫。?
3)?在適當(dāng)?shù)臅r候,使用眾所周知的縮寫替換冗長的詞組名稱。例如,用?UI?作為?User?Interface?縮寫,用?OLAP?作為?On-line?Analytical?Processing?的縮寫。?
4)?在使用縮寫時,對于超過兩個字符長度的縮寫請使用?Pascal?大小寫或?Camel?大小寫。例如,使用?HtmlButton?或?HTMLButton。但是,應(yīng)當(dāng)大寫僅有兩個字符的縮寫,如,System.IO,而不是?System.Io。
5.4?命名空間
1)?命名命名空間時的一般性規(guī)則是使用公司名稱,后跟技術(shù)名稱和可選的功能與設(shè)計(jì),如下所示。
????????????CompanyName.TechnologyName[.Feature][.Design]
????????例如:
?????????namespace?Langchao.Procurement?????????????//浪潮公司的采購單管理系統(tǒng)
?????????namespace?Langchao.Procurement.DataRules???//浪潮公司的采購單管理系統(tǒng)的業(yè)務(wù)規(guī)則模塊
2)?命名空間使用Pascal大小寫,用逗號分隔開。
3)?TechnologyName?指的是該項(xiàng)目的英文縮寫,或軟件名。
4)?命名空間和類不能使用同樣的名字。例如,有一個類被命名為Debug后,就不要再使用Debug作為一個名稱空間名。??
5.5?類
1)?使用?Pascal?大小寫。
2)?用名詞或名詞短語命名類。
3)?使用全稱避免縮寫,除非縮寫已是一種公認(rèn)的約定,如URL、HTML????
4)?不要使用類型前綴,如在類名稱上對類使用?C?前綴。例如,使用類名稱?FileStream,而不是?
???CFileStream。?
5)?不要使用下劃線字符?(_)。?
6?、有時候需要提供以字母?I?開始的類名稱,雖然該類不是接口。只要?I?是作為類名稱組成部分的整個單詞的第一個字母,這便是適當(dāng)?shù)摹@?#xff0c;類名稱?IdentityStore?是適當(dāng)?shù)摹T谶m當(dāng)?shù)牡胤?#xff0c;使用復(fù)合單詞命名派生的類。派生類名稱的第二個部分應(yīng)當(dāng)是基類的名稱。例如,ApplicationException?對于從名為?Exception?的類派生的類是適當(dāng)?shù)拿Q,原因ApplicationException?是一種Exception。請?jiān)趹?yīng)用該規(guī)則時進(jìn)行合理的判斷。例如,Button?對于從?Control?派生的類是適當(dāng)?shù)拿Q。盡管按鈕是一種控件,但是將?Control?作為類名稱的一部分將使名稱不必要地加長。
????????????public?class?FileStream
????????????public?class?Button
public?class?String
????
5.6?接口
以下規(guī)則概述接口的命名指南:?
1)?用名詞或名詞短語,或者描述行為的形容詞命名接口。例如,接口名稱?IComponent?使用描述性名詞。接口名稱?ICustomAttributeProvider?使用名詞短語。名稱?IPersistable?使用形容詞。?
2)?使用?Pascal?大小寫。?
3)?少用縮寫。?
4)?給接口名稱加上字母?I?前綴,以指示該類型為接口。在定義類/接口對(其中類是接口的標(biāo)準(zhǔn)實(shí)現(xiàn))時使用相似的名稱。兩個名稱的區(qū)別應(yīng)該只是接口名稱上有字母?I?前綴。?
5)?不要使用下劃線字符?(_)。?
6)?當(dāng)類是接口的標(biāo)準(zhǔn)執(zhí)行時,定義這一對類/接口組合就要使用相似的名稱。兩個名稱的不同之處只是接口名前有一個I前綴。
以下是正確命名的接口的示例。
????????????????public?interface?IServiceProvider
????????????????public?interface?IFormatable
以下代碼示例闡釋如何定義?IComponent?接口及其標(biāo)準(zhǔn)實(shí)現(xiàn)?Component?類。
???????????????public?interface?IComponent?
???????????????{
???????????????????//?Implementation?code?goes?here.
???????????????}
???????????????
???????????????public?class?Component:?IComponent?
???????????????{
???????????????????//?Implementation?code?goes?here.
}
5.7?屬性?(Attribute)
應(yīng)該總是將后綴?Attribute?添加到自定義屬性類。以下是正確命名的屬性類的示例。
??????????public?class?ObsoleteAttribute
??????????{
}???
5.8?枚舉?(Enum)
枚舉?(Enum)?值類型從?Enum?類繼承。以下規(guī)則概述枚舉的命名指南:?
1)?對于?Enum?類型和值名稱使用?Pascal?大小寫。?
2)?少用縮寫。?
3)?不要在?Enum?類型名稱上使用?Enum?后綴。?
4)?避免顯式指定枚舉的值
| //正確?? public?enum?Color??? {??? Red,Green,Blue??? }? ? //避免??? public?enum?Color??? {??? Red=1,Green=2,Blue=3??? } |
?
5)?避免為枚舉指定一個類型
| //避免?? public?enum?Color:long??? {??? Red,Green,Blue??? } |
????
5.9?參數(shù)
以下規(guī)則概述參數(shù)的命名指南:?
1)?使用描述性參數(shù)名稱。參數(shù)名稱應(yīng)當(dāng)具有足夠的描述性,以便參數(shù)的名稱及其類型可用于在大多數(shù)情況下確定它的含義。?
2)?對參數(shù)名稱使用?Camel?大小寫。?
3)?使用描述參數(shù)的含義的名稱,而不要使用描述參數(shù)的類型的名稱。開發(fā)工具將提供有關(guān)參數(shù)的類型的有意義的信息。因此,?通過描述意義,可以更好地使用參數(shù)的名稱。少用基于類型的參數(shù)名稱,僅在適合使用它們的地方使用它們。
4)?不要給參數(shù)名稱加匈牙利語類型表示法的前綴。?
以下是正確命名的參數(shù)的示例。
???????????????Type?GetType(string?typeName)
string?Format(string?format,?args()?As?object)
5.10?方法
以下規(guī)則概述方法的命名指南:?
1)?使用動詞或動詞短語命名方法。?
2)?使用?Pascal?大小寫。?
3)?以下是正確命名的方法的實(shí)例。
??????????????RemoveAll()
??????????????GetCharArray()
??Invoke()
5.11?屬性?(property)
以下規(guī)則概述屬性的命名指南:?
1)?使用名詞或名詞短語命名屬性。?
2)?使用?Pascal?大小寫。?
3)?不要使用匈牙利語表示法。?
4)?考慮用與屬性的基礎(chǔ)類型相同的名稱創(chuàng)建屬性。例如,如果聲明名為?Color?的屬性,則屬性的類型同樣應(yīng)該是?Color。請參閱本主題中后面的示例。?
以下代碼示例闡釋正確的屬性命名。
?????????????????public?class?SampleClass
?????????????????{
??????????????????????public?Color?BackColor?
??????????????????????{
???????????????????????????//?Code?for?Get?and?Set?accessors?goes?here.
???????????????????????}
??????????????????}
以下代碼示例闡釋提供其名稱與類型相同的屬性。
?????????????????public?enum?Color?
?????????????????{
?????????????????????//?Insert?code?for?Enum?here.
??????????????????}
??????????????????public?class?Control
{
???????????????????????public?Color?Color?
???????????????????????{?
get
{
//?Insert?code?here.
}?
set
{
//?Insert?code?here.
}?
????????????????????????}
???????????????????}
??????????
5.12?事件
以下規(guī)則概述事件的命名指南:?
1)?對事件處理程序名稱使用?EventHandler?后綴。?
2)?指定兩個名為?sender?和?e?的參數(shù)。sender?參數(shù)表示引發(fā)事件的對象。sender?參數(shù)始終是object?類型的,即使在可以使用更為特定的類型時也如此。與事件相關(guān)聯(lián)的狀態(tài)封裝在名為?e?的事件類的實(shí)例中。對?e?參數(shù)類型使用適當(dāng)而特定的事件類。?
3)?用?EventArgs?后綴命名事件參數(shù)類。?
4)?考慮用動詞命名事件。?
5)?使用動名詞(動詞的“ing”形式)創(chuàng)建表示事件前的概念的事件名稱,用過去式表示事件后。例如,可以取消的?Close?事件應(yīng)當(dāng)具有?Closing?事件和?Closed?事件。不要使用BeforeXxx/AfterXxx?命名模式。?
6)?不要在類型的事件聲明上使用前綴或者后綴。例如,使用?Close,而不要使用?OnClose。?
7)?通常情況下,對于可以在派生類中重寫的事件,應(yīng)在類型上提供一個受保護(hù)的方法(稱為?OnXxx)。此方法只應(yīng)具有事件參數(shù)?e,因?yàn)榘l(fā)送方總是類型的實(shí)例。?
以下示例闡釋具有適當(dāng)名稱和參數(shù)的事件處理程序。
????????????public?delegate?void?MouseEventHandler(object?sender,?MouseEventArgs?e);
以下示例闡釋正確命名的事件參數(shù)類。
????????????????public?class?MouseEventArgs?:?EventArgs?
????????????????{
???????????????????int?x;
???????????????int?y;
??????????????????public?MouseEventArgs(int?x,?int?y)?
??????????????????{
this.x?=?x;
this.y?=?y;?
}
??????????????????public?int?X
??????????????????{
??????????????????????get
??????????????????????{
??????????????????????????return?x;
??????????????????????}
??????????????????}?
??????????????????public?int?Y
??????????????????{
?????????????????get
???????????????????????{
???????????????????????????return?y;
???????????????????????}
??????????????????}?
????????????????}
5.13?常量?(const)
使用Pascal命名?
5.14?字段
以下規(guī)則概述字段的命名指南:?
1)?private、protected?使用?Camel?大小寫。
2)?public?使用?Pascal?大小寫。
3)?拼寫出字段名稱中使用的所有單詞。僅在開發(fā)人員一般都能理解時使用縮寫。字段名稱不要使用大寫字母。下面是正確命名的字段的示例。?
????????????????class?SampleClass?
????????????????{
????????????????????string?url;
?????????????string?destinationUrl;
}
4)?不要對字段名使用匈牙利語表示法。好的名稱描述語義,而非類型。?
5)?不要對字段名或靜態(tài)字段名應(yīng)用前綴。具體說來,不要對字段名稱應(yīng)用前綴來區(qū)分靜態(tài)和非靜態(tài)字段。例如,應(yīng)用?g_?或?s_?前綴是不正確的。?
5.15?靜態(tài)字段
以下規(guī)則概述靜態(tài)字段的命名指南:?
1)?使用名詞、名詞短語或者名詞的縮寫命名靜態(tài)字段。?
2)?使用?Pascal?大小寫。?
3)?對靜態(tài)字段名稱使用匈牙利語表示法前綴。?
4)?建議盡可能使用靜態(tài)屬性而不是公共靜態(tài)字段。?
5.16?集合
集合是一組組合在一起的類似的類型化對象,如哈希表、查詢、堆棧、字典和列表,集合的命名建議用復(fù)數(shù)。
5.17?范型
如果你對類型參數(shù)沒有其他的跟上下文有關(guān)的信息(additional?contextual?information),你應(yīng)該使用字母T:
5.18?措詞
避免使用與常用的?.NET?框架命名空間重復(fù)的類名稱。例如,不要將以下任何名稱用作類名稱:
System、Collections、Forms?或?UI。有關(guān)?.NET?框架命名空間的列表,請參閱類庫。
另外,避免使用和以下關(guān)鍵字沖突的標(biāo)識符。
| AddHandler | AddressOf | Alias | And | Ansi |
| As | Assembly | Auto | Base | Boolean |
| ByRef | Byte | ByVal | Call | Case |
| Catch | CBool | CByte | Cchar | CDate |
| CDec | CDbl | Char | Cint | Class |
| CLng | CObj | Const | Cshort | CSng |
| CStr | CType | Date | Decimal | Declare |
| Default | Delegate | Dim | Do | Double |
| Each | Else | ElseIf | End | Enum |
| Erase | Error | Event | Exit | ExternalSource |
| False | Finalize | Finally? | Float | For |
| Friend | Function | Get | GetType | Goto |
| Handles | If | Implements | Imports | In |
| Inherits | Integer | Interface | Is | Let |
| Lib | Like | Long | Loop | Me |
| Mod | Module | MustInherit | MustOverride | MyBase |
| MyClass | Namespace | New | Next | Not |
| Nothing | NotInheritable | NotOverridable | Object | On |
| Option | Optional | Or | Overloads | Overridable |
| Overrides | ParamArray | Preserve | Private | Property |
| Protected | Public | RaiseEvent | ReadOnly | ReDim |
| Region | REM | RemoveHandler | Resume | Return |
| Select | Set | Shadows | Shared | Short |
| Single | Static | Step | Stop | String |
| Structure | Sub | SyncLock | Then | Throw |
| To | True | Try | TypeOf | Unicode |
| Until | volatile | When | While | With |
| WithEvents | WriteOnly | Xor | Eval | extends |
| instanceof | package | var | ??? | ??? |
6?第六章 語句
6.1?每行一個語句
每行最多包含一個語句。如
?????????????a++;???????//推薦
?????????????b--;???????//推薦
??a++;?b--;??//不推薦
6.2?復(fù)合語句
復(fù)合語句是指包含"父語句{子語句;子語句;}"的語句,使用復(fù)合語句應(yīng)遵循以下幾點(diǎn):
1)?子語句要縮進(jìn)。
2)?左花括號“{”?在復(fù)合語句父語句的下一行并與之對齊,單獨(dú)成行。
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中實(shí)現(xiàn))使用格式
??????????????for?(initialization;?condition;?update);????//?update?user?id
????????
foreach?語句使用格式
??????????????foreach?(object?obj?in?array)
??????????????{
??????????????????statements;
}
???注意?1在循環(huán)過程中不要修改循環(huán)計(jì)數(shù)器。
???????????2對每個空循環(huán)體給出確認(rèn)性注釋。??????
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;?語句結(jié)束。
6.9?try?-?catch?語句??????
try?-?catch??語句使用格式
??????????????try
??????????????{
??????????????????statements;
??????????????}
??????????????catch?(ExceptionClass?e)
??????????????{
??????????????????statements;
??????????????}
??????????????finally
??????????????{
????????????????statements;
??????????????}
????
6.10?using?塊語句??????
using?塊語句使用格式
?????????????using?(object)
?????????????{
?????????????????statements;
?????????????}
7?控件命名規(guī)則
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?程序結(jié)構(gòu)
8.1?程序結(jié)構(gòu)規(guī)范
1)?程序結(jié)構(gòu)清晰,簡單易懂,單個函數(shù)的程序行數(shù)不得超過100行。避免使用大文件。如果一個文件里的代碼超過300~400行,必須考慮將代碼分開到不同類中。?避免寫太長的方法。一個典型的方法代碼在1~25行之間。如果一個方法發(fā)代碼超過25行,應(yīng)該考慮將其分解為不同的方法。一個文件應(yīng)避免超過2000行。
2)?打算干什么,要簡單,直截了當(dāng),代碼精簡,避免垃圾程序。
3)?盡量使用.NET庫函數(shù)和公共函數(shù)(無特殊情況不要使用外部方法調(diào)用windows的核心動態(tài)鏈接庫API)。
4)?不要隨意定義全局變量,盡量使用局部變量。
5)?方法名需能看出它作什么。別使用會引起誤解的名字。如果名字一目了然,就無需用文檔來解釋方法的功能了。
好:?
不好:?
6)?程序編碼力求簡潔,結(jié)構(gòu)清晰,避免太多的分支結(jié)構(gòu)及太過于技巧性的程序。
7)?避免采用過于復(fù)雜的條件測試,避免過多的循環(huán)嵌套和條件嵌套。?
8)?盡量使用.NET庫函數(shù)和公共函數(shù)(無特殊情況不要使用外部方法調(diào)用windows的核心動態(tài)鏈接庫API)。
9)?不要隨意定義全局變量,聲明局部變量,并傳遞給方法。不要在方法間共享成員變量。如果在幾個方法間共享一個成員變量,那就很難知道是哪個方法在什么時候修改了它的值。?
10)?別在程序中使用固定數(shù)值,用常量代替。
8.2?結(jié)構(gòu)書寫規(guī)范
1)?把所有系統(tǒng)框架提供的名稱空間組織到一起,把第三方提供的名稱空間放到系統(tǒng)名稱空間的下面
| void?SavePhoneNumber?(?string?phoneNumber?)? |
| //?This?method?will?save?the?phone?number.? |
2)?所有的類成員變量應(yīng)該被聲明在類的頂部,并用一個空行把它們和方法以及屬性的聲明區(qū)分開
| using?System;??? using?System.Collection.Generic;??? using?System.ComponentModel;??? using?System.Data;?? using?MyCompany;?? using?MyControls; |
| public?class?MyClass??? {??????? int?m_Number;??? string?m_Name;??? public?void?SomeMethod1();??? public?void?SomeMethod2();??? } |
| ? |
?
3)?避免采用多賦值語句,如x?=?y?=?z;。?
4)?必要時使用enum?。別用數(shù)字或字符串來指示離散值。?
好:?
不好:?
5)?一個方法只完成一個任務(wù)。不要把多個任務(wù)組合到一個方法中,即使那些任務(wù)非常小。
好:?
| enum?MailType? |
| void?SendMail?(string?message,?string?mailType)? |
| ?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. ??//?... ?} |
不好:?
6)?使用括號清晰地表達(dá)算術(shù)表達(dá)式和邏輯表達(dá)式的運(yùn)算順序。如將?x=a*b/c*d?寫成?x=(a*b/c)*d可避免閱讀者誤解為x=(a*b)/(c*d)。?
7)?總是使用以零為基數(shù)的數(shù)組。
8)?把引用的系統(tǒng)的namespace和自定義或第三方的用一個換行把它們分開.
9)?目錄結(jié)構(gòu)中要反應(yīng)出namespace的層次.
9?異常處理
9.1?異常處理
1)?不要“捕捉了異常卻什么也不做”。如果隱藏了一個異常,你將永遠(yuǎn)不知道異常到底發(fā)生了沒有。
2)?發(fā)生異常時,給出友好的消息給用戶,但要精確記錄錯誤的所有可能細(xì)節(jié),包括發(fā)生的時間,和相關(guān)方法,類名等。?
3)?不必每個方法都用try-catch。當(dāng)特定的異常可能發(fā)生時才使用。比如,當(dāng)你寫文件時,處理異常FileIOException.?
4)?別寫太大的?try-catch?模塊。如果需要,為每個執(zhí)行的任務(wù)編寫單獨(dú)的?try-catch?模塊。?這將幫你找出哪一段代碼產(chǎn)生異常,并給用戶發(fā)出特定的錯誤消息。
5)?只捕捉特定的異常,而不是一般的異常。
好:?
不好:?
| ?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. ??//?... ?} |
不必在所有方法中捕捉一般異常。不管它,讓程序崩潰。這將幫助你在開發(fā)周期發(fā)現(xiàn)大多數(shù)的錯誤。?
6)?避免利用返回值作為函數(shù)的錯誤代碼,應(yīng)該在程序中使用異常來處理錯誤。
10?其他
10.1?類型轉(zhuǎn)換
1)?盡量避免強(qiáng)制類型轉(zhuǎn)換。
2)?如果不得不做類型轉(zhuǎn)換,盡量使用as關(guān)鍵字安全的轉(zhuǎn)換到另一個類型。
?
10.2?正確性與容錯性要求
1)?程序首先是正確,其次是優(yōu)美
2)?無法證明你的程序沒有錯誤,因此在編寫完一段程序后,應(yīng)先回頭檢查。
3)?改一個錯誤時可能產(chǎn)生新的錯誤,因此在修改前首先考慮對其它程序的影響。
4)?對所有的用戶輸入,必須進(jìn)行合法性檢查。
5)?盡量不要比較浮點(diǎn)數(shù)的相等,如:?10.0?*?0.1?==?1.0?,?不可靠
6)?程序與環(huán)境或狀態(tài)發(fā)生關(guān)系時,必須主動去處理發(fā)生的意外事件,如文件能否邏輯鎖定、打印機(jī)是否聯(lián)機(jī)等,對于明確的錯誤,要有明確的容錯代碼提示用戶,在這樣不確定的場合都使用Try?Throw?Catch。
7)?單元測試也是編程的一部份,提交聯(lián)調(diào)測試的程序必須通過單元測試。
10.3?可重用性要求
1)?重復(fù)使用的完成相對獨(dú)立功能的算法或代碼應(yīng)抽象為asp.net服務(wù)或類。
2)?asp.net服務(wù)或類應(yīng)考慮OO思想,減少外界聯(lián)系,考慮獨(dú)立性或封裝性。
3)?避免讓你的代碼依賴于運(yùn)行在某個特定地方的程序集。
10.4?其他
1)??不要手動去修改任何機(jī)器生成的代碼
a)?如果修改了機(jī)器生成的代碼,修改你的編碼方式來適應(yīng)這個編碼標(biāo)準(zhǔn)
b)?盡可能使用partial?classes特性,以提高可維護(hù)性。(C#2.0新特性)?
2)?避免在一個程序集中(assembly)中定義多個Main()方法。
3)?只把那些絕對需要的方法定義成public,而其它的方法定義成internal。
4)?避免使用三元條件操作符。
5)?除非為了和其它語言進(jìn)行互動,否則絕不要使用不安(unsafe)的代碼。
6)?接口和類中方法和屬性的比應(yīng)該在2:1左右。
7)?努力保證一個接口有3~5個成員。
8)?避免在結(jié)構(gòu)中提供方法
a)?參數(shù)化的構(gòu)造函數(shù)是鼓勵使用的?
b)?可以重載運(yùn)行符
9)?當(dāng)早綁定(early-binding)可能的時候就盡量不要使用遲綁定(late-binding)。
10)?除了在一個構(gòu)造函數(shù)中調(diào)用其它的構(gòu)造函數(shù)之外,不要使用this關(guān)鍵字。
| void?ReadFromFile?(?string?fileName?)? |
| void?ReadFromFile?(?string?fileName?)? |
11)?不要使用base關(guān)鍵字訪問基類的成員,除非你在調(diào)用一個基類構(gòu)造函數(shù)的時候要解決一個子類的名稱沖突
| Dog?dog=new?GermanShepherd();??? GermanShepherd?shepherd=dog?as?GermanShepherd;?? if?(shepherd!=null)??? {…} |
| //Example?of?proper?use?of?‘this’??? public?class?MyClass??? {??? public?MyClass(string?message)??? {???}??? public?MyClass():this(“Hello”)??? {???}? } |
| //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)?生成和構(gòu)建一個長的字符串時,一定要使用StringBuilder,而不用string。
轉(zhuǎn)載于:https://www.cnblogs.com/makewong/archive/2010/04/28/1722678.html
總結(jié)
以上是生活随笔為你收集整理的实用C#编程规范(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net框架读书笔记---引用参数(re
- 下一篇: 针对$_SERVER[’PHP_SELF