C#編程規(guī)范--精選文檔_第1頁(yè)
C#編程規(guī)范--精選文檔_第2頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1 概述1.1 規(guī)范制定原則n 方便代碼的交流和維護(hù)。n 不影響編碼的效率,不與大眾習(xí)慣沖突。n 使代碼更美觀(guān)、閱讀更方便。n 使代碼的邏輯更清晰、更易于理解。1.2 術(shù)語(yǔ)定義n Pascal 大小寫(xiě) 將標(biāo)識(shí)符的首字母和后面連接的每個(gè)單詞的首字母都大寫(xiě)??梢詫?duì)三字符或更多字符的標(biāo)識(shí)符使用Pascal 大小寫(xiě)。例BackColorn Camel 大小寫(xiě) 標(biāo)識(shí)符的首字母小寫(xiě),而每個(gè)后面連接的單詞的首字母都大寫(xiě)。例如:backColor2 代碼外觀(guān)2.1 列寬 代碼列寬控制在110字符左右,原則上不超過(guò)屏寬。2.2 換行 當(dāng)表達(dá)式超出或即將超出規(guī)定的列寬,遵循以下規(guī)則進(jìn)行換行:n 在逗號(hào),括號(hào)后換行

2、。n 在操作符前換行。n 規(guī)則1優(yōu)先于規(guī)則2。 當(dāng)以上規(guī)則會(huì)導(dǎo)致代碼混亂的時(shí)候自己采取更靈活的換行規(guī)則。2.3 縮進(jìn) 縮進(jìn)應(yīng)該是每行一個(gè)Tab(4個(gè)空格),不要在代碼中使用Tab字符。 Visual Studio.Net設(shè)置:工具->選項(xiàng)->文本編輯器->C#->制表符->插入空格2.4 空行空行是為了將邏輯上相關(guān)聯(lián)的代碼分塊,以便提高代碼的可閱讀性。在以下情況下使用兩個(gè)空行:n 接口和類(lèi)的定義之間。n 枚舉和類(lèi)的定義之間。n 類(lèi)與類(lèi)的定義之間。 在以下情況下使用一個(gè)空行:n 方法與方法、屬性與屬性之間。n 方法中變量聲明與語(yǔ)句之間。n 方法與方法之間。n 方法中

3、不同的邏輯塊之間。n 方法中的返回語(yǔ)句與其他的語(yǔ)句之間。n 屬性與方法、屬性與字段、方法與字段之間。n 注釋與它注釋的語(yǔ)句間不空行,但與其他的語(yǔ)句間空一行。n 文件之中不得存在無(wú)規(guī)則的空行,比如說(shuō)連續(xù)十個(gè)空行??招惺菫榱藢⑦壿嬌舷嚓P(guān)聯(lián)的代碼分塊,以便提高代碼的可閱讀性。2.5 空格在以下情況中要使用到空格:n 關(guān)鍵字和左括符 “(” 應(yīng)該用空格隔開(kāi)。如 while (true) 注意在方法名和左括符 “(” 之間不要使用空格,這樣有助于辨認(rèn)代碼中的方法調(diào)用與關(guān)鍵字。n 多個(gè)參數(shù)用逗號(hào)隔開(kāi),每個(gè)逗號(hào)后都應(yīng)加一個(gè)空格。n 除了 . 之外,所有的二元操作符都應(yīng)用空格與它們的操作數(shù)隔開(kāi)。一元操作符、+

4、及-與操作 數(shù)間不需要空格。如 a += c + d; a = (a + b) / (c * d); while (d+ = s+) n+; PrintSize(“size is “ + size + “n”);n 語(yǔ)句中的表達(dá)式之間用空格隔開(kāi)。如for (expr1; expr2; expr3)2.6 花括號(hào) - n 左花括號(hào) “” 放于關(guān)鍵字或方法名的下一行并與之對(duì)齊。如 if (condition) public int Add(int x, int y) n 左花括號(hào) “” 要與相應(yīng)的右花括號(hào) “”對(duì)齊。n 通常情況下左花括號(hào) “”單獨(dú)成行,不與任何語(yǔ)句并列一行。n if、while、

5、do語(yǔ)句后一定要使用,即使號(hào)中為空或只有一條語(yǔ)句。如 if (somevalue = 1) somevalue = 2; n 右花括號(hào) “” 后建議加一個(gè)注釋以便于方便的找到與之相應(yīng)的 。如 while (1) if (valid) / if valid else / not valid / end forever3 程序注釋3.1 注釋概述n 修改代碼時(shí),總是使代碼周?chē)淖⑨尡3肿钚?。n 在每個(gè)例程的開(kāi)始,提供標(biāo)準(zhǔn)的注釋樣本以指示例程的用途、假設(shè)和限制很有幫助。注釋樣本應(yīng)該是解釋它為什么存在和可以做什么的簡(jiǎn)短介紹.n 避免在代碼行的末尾添加注釋?zhuān)恍形沧⑨屖勾a更難閱讀。不過(guò)在批注變量聲明時(shí),

6、行尾注釋是合適的;在這種情況下,將所有行尾注釋在公共制表位處對(duì)齊。 n 避免雜亂的注釋?zhuān)缫徽行翘?hào)。而是應(yīng)該使用空白將注釋同代碼分開(kāi)。 n 在部署發(fā)布之前,移除所有臨時(shí)或無(wú)關(guān)的注釋?zhuān)员苊庠谌蘸蟮木S護(hù)工作中產(chǎn)生混亂。n 如果需要用注釋來(lái)解釋復(fù)雜的代碼節(jié),請(qǐng)檢查此代碼以確定是否應(yīng)該重寫(xiě)它。盡一切可能不注釋難以理解的代碼,而應(yīng)該重寫(xiě)它。盡管一般不應(yīng)該為了使代碼更簡(jiǎn)單以便于人們使用而犧牲性能,但必須保持性能和可維護(hù)性之間的平衡。n 在編寫(xiě)注釋時(shí)使用完整的句子。注釋?xiě)?yīng)該闡明代碼,而不應(yīng)該增加多義性。 n 在編寫(xiě)代碼時(shí)就注釋?zhuān)驗(yàn)橐院蠛芸赡軟](méi)有時(shí)間這樣做。另外,如果有機(jī)會(huì)復(fù)查已編寫(xiě)的代碼,在今天看來(lái)很

7、明顯的東西六周以后或許就不明顯了。n 避免多余的或不適當(dāng)?shù)淖⑨專(zhuān)缬哪牟恢饕膫渥ⅰ 使用注釋來(lái)解釋代碼的意圖。它們不應(yīng)作為代碼的聯(lián)機(jī)翻譯。 n 注釋代碼中不十分明顯的任何內(nèi)容。n 為了防止問(wèn)題反復(fù)出現(xiàn),對(duì)錯(cuò)誤修復(fù)和解決方法代碼總是使用注釋。n 對(duì)由循環(huán)和邏輯分支組成的代碼使用注釋。這些是幫助源代碼讀者的主要方面。 n 在整個(gè)應(yīng)用程序中,使用具有一致的標(biāo)點(diǎn)和結(jié)構(gòu)的統(tǒng)一樣式來(lái)構(gòu)造注釋。 n 在所有的代碼修改處加上修改標(biāo)示的注釋。3.2 文件頭注釋說(shuō)明所有文件開(kāi)始添加如下注釋?zhuān)?/*- * 單元名稱(chēng): * 單元描述: * 創(chuàng)建人: * 創(chuàng)建日期: * 修改日志 * 修改人 修改日期 修改內(nèi)容

8、* * -*/3.3 文檔型注釋該類(lèi)注釋采用.Net已定義好的Xml標(biāo)簽來(lái)標(biāo)記,在聲明接口、類(lèi)、方法、屬性、字段都應(yīng)該使用該類(lèi)注釋?zhuān)员愦a完成后直接生成代碼文檔,讓別人更好的了解代碼的實(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 in

9、formation about output statements./</para> /<seealso cref="MyClass.Main"/> /</summary> public static void MyMethod(int Int1) 3.4 單行注釋該類(lèi)注釋用于n 方法內(nèi)的代碼注釋。如變量的聲明、代碼或代碼段的解釋。注釋示例: / 注釋語(yǔ)句 private int number;n 方法內(nèi)變量的聲明或花括號(hào)后的注釋, 注釋示例: if ( 1 = 1) / always true statement; 3.5 注釋標(biāo)簽 標(biāo)

10、簽用法作用<c>c>text</c> text 希望將其指示為代碼的文本。為您提供了一種將說(shuō)明中的文本標(biāo)記為代碼的方法。使用 <code> 將多行指示為代碼<para><para>content</para>content段落文本。用于諸如 <remarks> 或 <returns> 等標(biāo)記內(nèi),使您得以將結(jié)構(gòu)添加到文本中。<param><param name='name'>description</param>name 為方法參數(shù)名。將此名稱(chēng)

11、用單引號(hào)括起來(lái) (' ')。應(yīng)當(dāng)用于方法聲明的注釋中,以描述方法的一個(gè)參數(shù)。<paramref> <paramref name="name"/>name 要引用的參數(shù)名。將此名稱(chēng)用雙引號(hào)括起來(lái) (" ")。<paramref> 標(biāo)記為您提供了一種指示詞為參數(shù)的方法??梢蕴幚?XML 文件,從而用某種獨(dú)特的方法格式化該參數(shù)。<see><see cref="member"/>cref = "member" 對(duì)可以通過(guò)當(dāng)前編譯環(huán)境進(jìn)行調(diào)用的成員或

12、字段的引用。編譯器檢查到給定代碼元素存在后,將 member 傳遞給輸出 XML 中的元素名。必須將 member 括在雙引號(hào) (" ") 中。使您得以從文本內(nèi)指定鏈接。使用 <seealso> 指示希望在“請(qǐng)參閱”一節(jié)中出現(xiàn)的文本。<seealso><seealso cref="member"/>cref = "member" 對(duì)可以通過(guò)當(dāng)前編譯環(huán)境進(jìn)行調(diào)用的成員或字段的引用。編譯器檢查到給定代碼元素存在后,將 member 傳遞給輸出 XML 中的元素名。必須將 member 括在雙引號(hào) (&q

13、uot; ") 中使您得以指定希望在“請(qǐng)參閱”一節(jié)中出現(xiàn)的文本。使用 <see> 從文本<example><example>description</example>description 代碼示例的說(shuō)明。使用 <example> 標(biāo)記可以指定使用方法或其他庫(kù)成員的示例。一般情況下,這將涉及到 <code> 標(biāo)記的使用。<code><code>content</code>content 為希望將其標(biāo)記為代碼的文本。 記為您提供了一種將多行指示為代碼的方法。使用 <c>

14、; 指示應(yīng)將說(shuō)明中的文本標(biāo)記為代碼<summary><summary>description</summary>此處description 為對(duì)象的摘要。應(yīng)當(dāng)用于描述類(lèi)型成員。使用 <remarks> 以提供有關(guān)類(lèi)型本身的信息。<exception><exception cref="member">description</exception>cref = "member" 對(duì)可從當(dāng)前編譯環(huán)境中獲取的異常的引用。編譯器檢查到給定異常存在后,將 member 轉(zhuǎn)換為輸出 X

15、ML 中的規(guī)范化元素名。必須將 member 括在雙引號(hào) (" ") 中。description 說(shuō)明。<exception> 標(biāo)記使您可以指定類(lèi)能夠引發(fā)的異常。<include><include file='filename' path='tagpathname="id"' />filename 包含文檔的文件名。該文件名可用路徑加以限定。將 filename 括在單引號(hào)中 (' ')。 Tagpath:filename 中指向標(biāo)記名的標(biāo)記路徑。將此路徑括在單引號(hào)中 (

16、' ')。 name 注釋前邊的標(biāo)記中的名稱(chēng)說(shuō)明符;名稱(chēng)具有一個(gè) id。 id 位于注釋之前的標(biāo)記的 id。將此 id 括在雙引號(hào)中 (" ")。<include> 標(biāo)記使您得以引用描述源代碼中類(lèi)型和成員的另一文件中的注釋。這是除了將文檔注釋直接置于源代碼文件中之外的另一種可選方法。<include> 標(biāo)記使用 XML XPath 語(yǔ)法。有關(guān)自定義 <include> 使用的方法,請(qǐng)參閱 XPath 文檔。<list> <list type="bullet" | "numbe

17、r" | "table"> <listheader> <term>term</term> <description>description</description> </listheader> <item> <term>term</term> <description>description</description> </item></list>term 定義的項(xiàng),該項(xiàng)將在 text 中定義。 des

18、cription 目符號(hào)列表或編號(hào)列表中的項(xiàng)或者 term 的定義。<listheader> 塊用于定義表或定義列表中的標(biāo)題行。定義表時(shí),只需為標(biāo)題中的項(xiàng)提供一個(gè)項(xiàng)。列表中的每一項(xiàng)用 <item> 塊指定。創(chuàng)建定義列表時(shí),既需要指定 term 也需要指定 text。但是,對(duì)于表、項(xiàng)目符號(hào)列表或編號(hào)列表,只需為 text 提供一個(gè)項(xiàng)。列表或表所擁有的 <item> 塊數(shù)可以根據(jù)需要而定。<permission><permission cref="member">description</permission&g

19、t;cref = "member" 對(duì)可以通過(guò)當(dāng)前編譯環(huán)境進(jìn)行調(diào)用的成員或字段的引用。編譯器檢查到給定代碼元素存在后,將 member 轉(zhuǎn)換為輸出 XML 中的規(guī)范化元素名。必須將 member 括在雙引號(hào) (" ") 中。 description 成員的訪(fǎng)問(wèn)的說(shuō)明。<permission> 標(biāo)記使您得以將成員的訪(fǎng)問(wèn)記入文檔。System.Security.PermissionSet 使您得以指定對(duì)成員的訪(fǎng)問(wèn)。<remarks><remarks>description</remarks>descriptio

20、n 成員的說(shuō)明。<remarks> 標(biāo)記是可以指定有關(guān)類(lèi)或其他類(lèi)型的概述信息的位置。<summary> 是可以描述該類(lèi)型的成員的位置。<returns> <returns>description</returns>description 返回值的說(shuō)明。<returns> 標(biāo)記應(yīng)當(dāng)用于方法聲明的注釋?zhuān)悦枋龇祷刂怠?lt;value> <value>property-description</value>property-description 屬性的說(shuō)明。<value> 標(biāo)記使您得

21、以描述屬性。請(qǐng)注意,當(dāng)在 Visual Studio .NET 開(kāi)發(fā)環(huán)境中通過(guò)代碼向?qū)砑訉傩詴r(shí),它將會(huì)為新屬性添加 <summary> 標(biāo)記。然后,應(yīng)該手動(dòng)添加 <value> 標(biāo)記以描述該屬性所表示的值。4 申明4.1 每行聲明數(shù)一行只建議作一個(gè)聲明,并按字母順序排列。如: int level; /推薦 int size; /推薦 int x, y; /不推薦4.2 初始化建議在變量聲明時(shí)就對(duì)其做初始化。4.3 位置變量建議置于塊的開(kāi)始處,不要總是在第一次使用它們的地方做聲明。如: void MyMethod() int int1 = 0; / beginning

22、of method blockif (condition) int int2 = 0; / beginning of "if" block . 不過(guò)也有一個(gè)例外: for (int i = 0; i < maxLoops; i+) . 應(yīng)避免不同層次間的變量重名,如: int count; .void MyMethod() if (condition) int count = 0; / 避免 . .4.4 類(lèi)和接口的聲明n 在方法名與其后的左括號(hào)間沒(méi)有任何空格。n 左花括號(hào) “” 出現(xiàn)在聲明的下行并與之對(duì)齊,單獨(dú)成行。n 方法間用一個(gè)空行隔開(kāi)。5 第五章命名規(guī)范5.1

23、 命名概述名稱(chēng)應(yīng)該說(shuō)明“什么”而不是“如何”。通過(guò)避免使用公開(kāi)基礎(chǔ)實(shí)現(xiàn)(它們會(huì)發(fā)生改變)的名稱(chēng),可以保留簡(jiǎn)化復(fù)雜性的抽象層。例如,可以使用 GetNextStudent(),而不是 GetNextArrayElement()。選擇正確名稱(chēng)時(shí)的困難可能表明需要進(jìn)一步分析或定義項(xiàng)的目的。使名稱(chēng)足夠長(zhǎng)以便有一定的意義,并且足夠短以避免冗長(zhǎng)。唯一名稱(chēng)在編程上僅用于將各項(xiàng)區(qū)分開(kāi)。表現(xiàn)力強(qiáng)的名稱(chēng)是為了幫助人們閱讀;因此,提供人們可以理解的名稱(chēng)是有意義的。其實(shí)從長(zhǎng)變量名的負(fù)面作用三,因?yàn)镃trl+C和Ctrl+V加上在VS中的智能感知,其負(fù)面追用已經(jīng)很小。最優(yōu)秀的代碼它本身就是注釋。作為一流的程序員。并不僅

24、僅實(shí)現(xiàn)功能,而是要讓我們的代碼更加優(yōu)美,具備讓他人維護(hù)或今后擴(kuò)充的能力。作為現(xiàn)在的業(yè)務(wù)系統(tǒng),其門(mén)檻的準(zhǔn)入水平已大大降低,實(shí)現(xiàn)功能上的需求已沒(méi)有什么難度,但是高手和菜鳥(niǎo)的區(qū)別在于,高手的代碼通俗易懂,在整個(gè)編碼的過(guò)程中,不僅能考慮到性能、還會(huì)考慮代碼可讀性和維護(hù)性。不過(guò),請(qǐng)確保選擇的名稱(chēng)符合適用語(yǔ)言的規(guī)則和標(biāo)準(zhǔn)。以下幾點(diǎn)是推薦的命名方法。n 避免容易被主觀(guān)解釋的難懂的名稱(chēng),如命名 AnalyzeThis(),或者屬性名 xxK8。這樣的名稱(chēng)會(huì)導(dǎo)致多義性。n 在類(lèi)屬性的名稱(chēng)中包含類(lèi)名是多余的,如 Book.BookTitle。而是應(yīng)該使用 Book.Title。n 只要合適,在變量名的末尾或開(kāi)頭加

25、計(jì)算限定符(Avg、Sum、Min、Max、Index)。n 在變量名中使用互補(bǔ)對(duì),如 min/max、begin/end 和 open/close。 n 布爾變量名應(yīng)該包含 Is,這意味著 Yes/No 或 True/False 值,如 fileIsFound。n 在命名狀態(tài)變量時(shí),避免使用諸如 Flag 的術(shù)語(yǔ)。狀態(tài)變量不同于布爾變量的地方是它可以具有兩個(gè)以上的可能值。不是使用 documentFlag,而是使用更具描述性的名稱(chēng),如 documentFormatType。 (此項(xiàng)只供參考)n 即使對(duì)于可能僅出現(xiàn)在幾個(gè)代碼行中的生存期很短的變量,仍然使用有意義的名稱(chēng)。僅對(duì)于短循環(huán)索引使用單字

26、母變量名,如 i 或 j。 可能的情況下,盡量不要使用原義數(shù)字或原義字符串,如 For i = 1 To 7。而是使用命名常數(shù),如 For i = 1 To NUM_DAYS_IN_WEEK 以便于維護(hù)和理解。n 文件名要和類(lèi)名相同,一般情況下一個(gè)類(lèi)一個(gè)文件,文件名遵從Pascal命名法,無(wú)特殊情況,擴(kuò)展名小寫(xiě),使用統(tǒng)一而又通用的文件擴(kuò)展名: C# 類(lèi) .cs。5.2 大小寫(xiě)規(guī)則下表匯總了大寫(xiě)規(guī)則,并提供了不同類(lèi)型的標(biāo)識(shí)符的示例。標(biāo)識(shí)符大小寫(xiě)示例類(lèi)PascalAppDomain枚舉類(lèi)型PascalErrorLevel枚舉值PascalFatalError事件PascalValueChange異

27、常類(lèi)PascalWebException 注意 總是以 Exception 后綴結(jié)尾。只讀的靜態(tài)字段PascalRedValue接口PascalIDisposable 注意 總是以 I 前綴開(kāi)始。方法PascalToString命名空間PascalSystem.Drawing屬性PascalBackColor公共實(shí)例字段PascalRedValue 注意 很少使用。屬性?xún)?yōu)于使用公共實(shí)例字段。受保護(hù)的實(shí)例字段Camel redValue 注意 很少使用。屬性?xún)?yōu)于使用受保護(hù)的實(shí)例字段。私有的實(shí)例字段CamelredValue參數(shù)CameltypeName方法內(nèi)的變量CamelbackColor5.

28、3 縮寫(xiě)為了避免混淆和保證跨語(yǔ)言交互操作,請(qǐng)遵循有關(guān)區(qū)縮寫(xiě)的使用的下列規(guī)則: n 不要將縮寫(xiě)或縮略形式用作標(biāo)識(shí)符名稱(chēng)的組成部分。例如,使用 GetWindow,而不要使用 GetWin。 n 不要使用計(jì)算機(jī)領(lǐng)域中未被普遍接受的縮寫(xiě)。 n 在適當(dāng)?shù)臅r(shí)候,使用眾所周知的縮寫(xiě)替換冗長(zhǎng)的詞組名稱(chēng)。例如,用 UI 作為 User Interface 縮寫(xiě),用 OLAP 作為 On-line Analytical Processing 的縮寫(xiě)。 n 在使用縮寫(xiě)時(shí),對(duì)于超過(guò)兩個(gè)字符長(zhǎng)度的縮寫(xiě)請(qǐng)使用 Pascal 大小寫(xiě)或 Camel 大小寫(xiě)。例如,使用 HtmlButton 或 HTMLButton。但是,

29、應(yīng)當(dāng)大寫(xiě)僅有兩個(gè)字符的縮寫(xiě),如,System.IO,而不是 System.Io。5.4 命名空間n 命名命名空間時(shí)的一般性規(guī)則是使用公司名稱(chēng),后跟技術(shù)名稱(chēng)和可選的功能與設(shè)計(jì),如下所示: CompanyName.TechnologyName.Feature.Designn 命名空間使用Pascal大小寫(xiě),用逗號(hào)分隔開(kāi)。n TechnologyName 指的是該項(xiàng)目的英文縮寫(xiě),或軟件名。n 命名空間和類(lèi)不能使用同樣的名字。例如,有一個(gè)類(lèi)被命名為Debug后,就不要再使用Debug作為一個(gè)名稱(chēng)空間名。 5.5 類(lèi)n 使用 Pascal 大小寫(xiě)。n 用名詞或名詞短語(yǔ)命名類(lèi)。n 使用全稱(chēng)避免縮寫(xiě),除非縮

30、寫(xiě)已是一種公認(rèn)的約定,如URL、HTMLn 不要使用類(lèi)型前綴,如在類(lèi)名稱(chēng)上對(duì)類(lèi)使用 C 前綴。例如,使用類(lèi)名稱(chēng) FileStream,而不是 CFileStream。 n 不要使用下劃線(xiàn)字符 (_)。 n 有時(shí)候需要提供以字母 I 開(kāi)始的類(lèi)名稱(chēng),雖然該類(lèi)不是接口。只要 I 是作為類(lèi)名稱(chēng)組成部分的整個(gè)單詞的第一個(gè)字母,這便是適當(dāng)?shù)摹@?,?lèi)名稱(chēng) IdentityStore 是適當(dāng)?shù)?。在適當(dāng)?shù)牡胤?,使用?fù)合單詞命名派生的類(lèi)。派生類(lèi)名稱(chēng)的第二個(gè)部分應(yīng)當(dāng)是基類(lèi)的名稱(chēng)。例如,ApplicationException 對(duì)于從名為 Exception 的類(lèi)派生的類(lèi)是適當(dāng)?shù)拿Q(chēng),原因ApplicationEx

31、ception 是一種Exception。請(qǐng)?jiān)趹?yīng)用該規(guī)則時(shí)進(jìn)行合理的判斷。例如,Button 對(duì)于從 Control 派生的類(lèi)是適當(dāng)?shù)拿Q(chēng)。盡管按鈕是一種控件,但是將 Control 作為類(lèi)名稱(chēng)的一部分將使名稱(chēng)不必要地加長(zhǎng)。 public class FileStream public class Buttonpublic class String 5.6 接口以下規(guī)則概述接口的命名指南: n 用名詞或名詞短語(yǔ),或者描述行為的形容詞命名接口。例如,接口名稱(chēng) IComponent 使用描述性名詞。接口名稱(chēng) ICustomAttributeProvider 使用名詞短語(yǔ)。名稱(chēng) IPersistab

32、le 使用形容詞。 n 使用 Pascal 大小寫(xiě)。 n 少用縮寫(xiě)。 n 給接口名稱(chēng)加上字母 I 前綴,以指示該類(lèi)型為接口。在定義類(lèi)/接口對(duì)(其中類(lèi)是接口的標(biāo)準(zhǔn)實(shí)現(xiàn))時(shí)使用相似的名稱(chēng)。兩個(gè)名稱(chēng)的區(qū)別應(yīng)該只是接口名稱(chēng)上有字母 I 前綴。 n 不要使用下劃線(xiàn)字符 (_)。 n 當(dāng)類(lèi)是接口的標(biāo)準(zhǔn)執(zhí)行時(shí),定義這一對(duì)類(lèi)/接口組合就要使用相似的名稱(chēng)。兩個(gè)名稱(chēng)的不同之處只是接口名前有一個(gè)I前綴。以下是正確命名的接口的示例。 public interface IServiceProvider public interface IFormatable以下代碼示例闡釋如何定義 IComponent 接口及其標(biāo)準(zhǔn)實(shí)

33、現(xiàn) Component 類(lèi)。 public interface IComponent / Implementation code goes here. public class Component: IComponent / Implementation code goes here.5.7 屬性 (Attribute)應(yīng)該總是將后綴 Attribute 添加到自定義屬性類(lèi)。以下是正確命名的屬性類(lèi)的示例。 public class ObsoleteAttribute 5.8 枚舉 (Enum)枚舉 (Enum) 值類(lèi)型從 Enum 類(lèi)繼承。以下規(guī)則概述枚舉的命名指南: n 對(duì)于 Enum 類(lèi)型

34、和值名稱(chēng)使用 Pascal 大小寫(xiě)。 n 少用縮寫(xiě)。 n 不要在 Enum 類(lèi)型名稱(chēng)上使用 Enum 后綴。 n 避免顯式指定枚舉的值/正確  public enum Color      Red,Green,Blue     /避免   public enum Color      Red=1,Green=2,Blue=3   n 避免為枚舉指定一個(gè)類(lèi)型/避免  p

35、ublic enum Color:long      Red,Green,Blue   5.9 參數(shù)以下規(guī)則概述參數(shù)的命名指南: n 使用描述性參數(shù)名稱(chēng)。參數(shù)名稱(chēng)應(yīng)當(dāng)具有足夠的描述性,以便參數(shù)的名稱(chēng)及其類(lèi)型可用于在大多數(shù)情況下確定它的含義。 n 對(duì)參數(shù)名稱(chēng)使用 Camel 大小寫(xiě)。 n 使用描述參數(shù)的含義的名稱(chēng),而不要使用描述參數(shù)的類(lèi)型的名稱(chēng)。開(kāi)發(fā)工具將提供有關(guān)參數(shù)的類(lèi)型的有意義的信息。因此, 通過(guò)描述意義,可以更好地使用參數(shù)的名稱(chēng)。少用基于類(lèi)型的參數(shù)名稱(chēng),僅在適合使用它們的地方使用它們。n 不要給參數(shù)名稱(chēng)加匈牙利

36、語(yǔ)類(lèi)型表示法的前綴。 以下是正確命名的參數(shù)的示例。 Type GetType(string typeName)string Format(string format, args() As object)5.10 方法以下規(guī)則概述方法的命名指南: n 使用動(dòng)詞或動(dòng)詞短語(yǔ)命名方法。 n 使用 Pascal 大小寫(xiě)。 n 以下是正確命名的方法的實(shí)例。 RemoveAll() GetCharArray() Invoke()5.11 屬性 (property)以下規(guī)則概述屬性的命名指南: n 使用名詞或名詞短語(yǔ)命名屬性。 n 使用 Pascal 大小寫(xiě)。 n 不要使用匈牙利語(yǔ)表示法。 n 考慮用與屬性的

37、基礎(chǔ)類(lèi)型相同的名稱(chēng)創(chuàng)建屬性。例如,如果聲明名為 Color 的屬性,則屬性的類(lèi)型同樣應(yīng)該是 Color。請(qǐng)參閱本主題中后面的示例。 以下代碼示例闡釋正確的屬性命名。 public class SampleClass public Color BackColor / Code for Get and Set accessors goes here. 5.12 事件以下規(guī)則概述事件的命名指南: n 對(duì)事件處理程序名稱(chēng)使用 EventHandler 后綴。 n 指定兩個(gè)名為 sender 和 e 的參數(shù)。sender 參數(shù)表示引發(fā)事件的對(duì)象。sender 參數(shù)始終是object 類(lèi)型的,即使在可以使

38、用更為特定的類(lèi)型時(shí)也如此。與事件相關(guān)聯(lián)的狀態(tài)封裝在名為 e 的事件類(lèi)的實(shí)例中。對(duì) e 參數(shù)類(lèi)型使用適當(dāng)而特定的事件類(lèi)。 n 用 EventArgs 后綴命名事件參數(shù)類(lèi)。 n 考慮用動(dòng)詞命名事件。 n 使用動(dòng)名詞(動(dòng)詞的“ing”形式)創(chuàng)建表示事件前的概念的事件名稱(chēng),用過(guò)去式表示事件后。例如,可以取消的 Close 事件應(yīng)當(dāng)具有 Closing 事件和 Closed 事件。不要使用BeforeXxx/AfterXxx 命名模式。 n 不要在類(lèi)型的事件聲明上使用前綴或者后綴。例如,使用 Close,而不要使用 OnClose。 n 通常情況下,對(duì)于可以在派生類(lèi)中重寫(xiě)的事件,應(yīng)在類(lèi)型上提供一個(gè)受保護(hù)

39、的方法(稱(chēng)為 OnXxx)。此方法只應(yīng)具有事件參數(shù) e,因?yàn)榘l(fā)送方總是類(lèi)型的實(shí)例。 以下示例闡釋具有適當(dāng)名稱(chēng)和參數(shù)的事件處理程序。 public delegate void MouseEventHandler(object sender, MouseEventArgs e);以下示例闡釋正確命名的事件參數(shù)類(lèi)。 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; publ

40、ic int Y get return y; 5.13 常量 (const)使用Pascal命名 5.14 字段以下規(guī)則概述字段的命名指南: n private、protected 使用 Camel 大小寫(xiě)。n public 使用 Pascal 大小寫(xiě)。n 拼寫(xiě)出字段名稱(chēng)中使用的所有單詞。僅在開(kāi)發(fā)人員一般都能理解時(shí)使用縮寫(xiě)。字段名稱(chēng)不要使用大寫(xiě)字母。下面是正確命名的字段的示例。 class SampleClass string url; string destinationUrl;n 不要對(duì)字段名使用匈牙利語(yǔ)表示法。好的名稱(chēng)描述語(yǔ)義,而非類(lèi)型。 n 不要對(duì)字段名或靜態(tài)字段名應(yīng)用前綴。具體說(shuō)來(lái),

41、不要對(duì)字段名稱(chēng)應(yīng)用前綴來(lái)區(qū)分靜態(tài)和非靜態(tài)字段。例如,應(yīng)用 g_ 或 s_ 前綴是不正確的。 5.15 靜態(tài)字段以下規(guī)則概述靜態(tài)字段的命名指南: n 使用名詞、名詞短語(yǔ)或者名詞的縮寫(xiě)命名靜態(tài)字段。 n 使用 Pascal 大小寫(xiě)。 n 對(duì)靜態(tài)字段名稱(chēng)使用匈牙利語(yǔ)表示法前綴。 n 建議盡可能使用靜態(tài)屬性而不是公共靜態(tài)字段。 5.16 集合集合是一組組合在一起的類(lèi)似的類(lèi)型化對(duì)象,如哈希表、查詢(xún)、堆棧、字典和列表,集合的命名建議用復(fù)數(shù)。5.17 范型如果你對(duì)類(lèi)型參數(shù)沒(méi)有其他的跟上下文有關(guān)的信息(additional contextual information),你應(yīng)該使用字母T。

42、packagevar      6 第六章語(yǔ)句6.1 每行一個(gè)語(yǔ)句每行最多包含一個(gè)語(yǔ)句。如 a+; /推薦 b-; /推薦 a+; b-; /不推薦6.2 復(fù)合語(yǔ)句復(fù)合語(yǔ)句是指包含"父語(yǔ)句子語(yǔ)句;子語(yǔ)句;"的語(yǔ)句,使用復(fù)合語(yǔ)句應(yīng)遵循以下幾點(diǎn):n 子語(yǔ)句要縮進(jìn)。n 左花括號(hào)“” 在復(fù)合語(yǔ)句父語(yǔ)句的下一行并與之對(duì)齊,單獨(dú)成行。n 即使只有一條子語(yǔ)句也不要省略花括號(hào)“ ”。 如 while (d + = s+) n+; 6.3 return 語(yǔ)句return語(yǔ)句中不使用括號(hào),除非它能使返回值更加清晰。如: return;

43、 return myDisk.size(); return (size ? size : defaultSize)7 控件命名規(guī)則7.1 命名方法控件名簡(jiǎn)寫(xiě)+英文描述,英文描述首字母大寫(xiě)。7.2 主要控件名簡(jiǎn)寫(xiě)對(duì)照表控件名簡(jiǎn)寫(xiě)控件名簡(jiǎn)寫(xiě)LabellblTextBoxtxtButtonbtnLinkButtonlnkbtnImageButtonimgbtnDropDownListddlListBoxlstDataGriddgDataListdlCheckBoxchkCheckBoxListchklsRadioButtonrdoRadioButtonListrdoltImageimgPanelpn

44、lCalendercldAdRotatorarTabletblRequiredFieldValidatorrfvCompareValidatorcvRangeValidatorrvRegularExpressionValidatorrevValidatorSummaryvsCrystalReportViewerrptvew8 程序結(jié)構(gòu)8.1 程序結(jié)構(gòu)規(guī)范n 程序結(jié)構(gòu)清晰,簡(jiǎn)單易懂,單個(gè)函數(shù)的程序行數(shù)不得超過(guò)100行。避免使用大文件。如果一個(gè)文件里的代碼超過(guò)300400行,必須考慮將代碼分開(kāi)到不同類(lèi)中。 避免寫(xiě)太長(zhǎng)的方法。一個(gè)典型的方法代碼在125行之間。如果一個(gè)方法發(fā)代碼超過(guò)25行,應(yīng)該考慮將

45、其分解為不同的方法。一個(gè)文件應(yīng)避免超過(guò)2000行。n 打算干什么,要簡(jiǎn)單,直截了當(dāng),代碼精簡(jiǎn),避免垃圾程序。n 盡量使用.NET庫(kù)函數(shù)和公共函數(shù)(無(wú)特殊情況不要使用外部方法調(diào)用windows的核心動(dòng)態(tài)鏈接庫(kù)API)。n 不要隨意定義全局變量,盡量使用局部變量。n 方法名需能看出它作什么。別使用會(huì)引起誤解的名字。如果名字一目了然,就無(wú)需用文檔來(lái)解釋方法的功能了。好: void SavePhoneNumber ( string phoneNumber )       / 

46、;Save the phone number. 不好: / This method will save the phone number. void SaveData ( string phoneNumber )       / Save the phone number. n 程序編碼力求簡(jiǎn)潔,結(jié)構(gòu)清晰,避

47、免太多的分支結(jié)構(gòu)及太過(guò)于技巧性的程序。n 避免采用過(guò)于復(fù)雜的條件測(cè)試,避免過(guò)多的循環(huán)嵌套和條件嵌套。 n 盡量使用.NET庫(kù)函數(shù)和公共函數(shù)(無(wú)特殊情況不要使用外部方法調(diào)用windows的核心動(dòng)態(tài)鏈接庫(kù)API)。n 不要隨意定義全局變量,聲明局部變量,并傳遞給方法。不要在方法間共享成員變量。如果在幾個(gè)方法間共享一個(gè)成員變量,那就很難知道是哪個(gè)方法在什么時(shí)候修改了它的值。 n 別在程序中使用固定數(shù)值,用常量代替。8.2 結(jié)構(gòu)書(shū)寫(xiě)規(guī)范n 把所有系統(tǒng)框架提供的名稱(chēng)空間組織到一起,把第三方提供的名稱(chēng)空間放到系統(tǒng)名稱(chēng)空間的下面using System;   using

48、0;System.Collection.Generic;   using System.ComponentModel;   using System.Data;  using MyCompany;  using MyControls;n 所有的類(lèi)成員變量應(yīng)該被聲明在類(lèi)的頂部,并用一個(gè)空行把它們和方法以及屬性的聲明區(qū)分開(kāi)public class MyClass          int m_Numb

49、er;   string m_Name;   public void SomeMethod1();   public void SomeMethod2();   n 避免采用多賦值語(yǔ)句,如x = y = z;。 n 必要時(shí)使用enum 。別用數(shù)字或字符串來(lái)指示離散值。 好: enum MailType  void SendMail (string message, MailType ma

50、ilType)       switch ( mailType )                 case MailType.Html:            / Do some

51、thing            break;          case MailType.PlainText:            / Do something     &#

52、160;      break;           case MailType.Attachment:            / Do something          &#

53、160; break;           default:            / Do something            break;      

54、不好: void SendMail (string message, string mailType)       switch ( mailType )                 case "Html":   &

55、#160;        / Do something            break;           case "PlainText":        

56、;    / Do something            break;           case "Attachment":            &#

57、160;/ Do something            break;           default:            / Do something    

58、        break;       n 一個(gè)方法只完成一個(gè)任務(wù)。不要把多個(gè)任務(wù)組合到一個(gè)方法中,即使那些任務(wù)非常小。好: void SaveAddress ( string address ) / Save the address. / . void SendEmail ( string address, string email ) / Send an email to inform the supervisor that the add

59、ress 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. / . n 使用括號(hào)清晰地表達(dá)算術(shù)表達(dá)式和邏輯表達(dá)式的運(yùn)算順序。如將 x=a*b/c*d 寫(xiě)成 x=(a*b/c)*d可避免閱讀者誤解為x=(a*b)/(c*d)。 n 總是使用以零為基數(shù)的數(shù)組。n 把引用的系統(tǒng)的namesp

60、ace和自定義或第三方的用一個(gè)換行把它們分開(kāi).n 目錄結(jié)構(gòu)中要反應(yīng)出namespace的層次.9 異常處理9.1 異常處理n 不要“捕捉了異常卻什么也不做”。如果隱藏了一個(gè)異常,你將永遠(yuǎn)不知道異常到底發(fā)生了沒(méi)有。n 發(fā)生異常時(shí),給出友好的消息給用戶(hù),但要精確記錄錯(cuò)誤的所有可能細(xì)節(jié),包括發(fā)生的時(shí)間,和相關(guān)方法,類(lèi)名等。 n 不必每個(gè)方法都用try-catch。當(dāng)特定的異??赡馨l(fā)生時(shí)才使用。比如,當(dāng)你寫(xiě)文件時(shí),處理異常FileIOException. n 別寫(xiě)太大的 try-catch 模塊。如果需要,為每個(gè)執(zhí)行的任務(wù)編寫(xiě)單獨(dú)的 try-catch 模塊。 這將幫你找出哪一段代碼產(chǎn)生異常,并給用戶(hù)

61、發(fā)出特定的錯(cuò)誤消息。n 只捕捉特定的異常,而不是一般的異常。好: void ReadFromFile ( string fileName )       try                 / read from file.    &#

62、160;       catch (FileIOException ex)                 / log error.           /  re-throw exception dependi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論