实用C#编程规范(转载)
1?概述
1.1?規范制定原則
1)?方便代碼的交流和維護。
2)?不影響編碼的效率,不與大眾習慣沖突。
3)?使代碼更美觀、閱讀更方便。
4)?使代碼的邏輯更清晰、更易于理解。
1.2?術語定義
1)?Pascal?大小寫
??????將標識符的首字母和后面連接的每個單詞的首字母都大寫。可以對三字符或更多字符的標識符使用Pascal?大小寫。例
BackColor
2)?Camel?大小寫
??????標識符的首字母小寫,而每個后面連接的單詞的首字母都大寫。例如:
?????backColor
1.3?文件命名組織
1.3.1?文件命名
1)?文件名遵從Pascal命名法,無特殊情況,擴展名小寫。
2)?使用統一而又通用的文件擴展名:?C#?類??.cs
1.3.2?文件注釋
1)?在每個文件頭必須包含以下注釋說明
????????????/*----------------------------------------------------------------
????????????//?Copyright?(C)?公司名稱
????????????//?版權所有。?
????????????//
????????????//?文件名:
????????????//?文件功能描述:
????????????//
????????????//?
????????????//?創建標識:
????????????//
????????????//?修改標識:
????????????//?修改描述:
????????????//
????????????//?修改標識:
????????????//?修改描述:
//----------------------------------------------------------------*/
2)?文件功能描述只需簡述,具體詳情在類的注釋中描述。
3)?創建標識和修改標識由創建或修改人員的拼音或英文名加日期組成。如:
????姚明20040408
4)?一天內有多個修改的只需做一個在注釋說明中做一個修改標識就夠了。
5)?在所有的代碼修改處加上修改標識的注釋。
2?代碼外觀
2.1?列寬
????代碼列寬控制在110字符左右,原則上不超過屏寬。
2.2?換行
??????當表達式超出或即將超出規定的列寬,遵循以下規則進行換行:
??????????1、在逗號,括號后換行。
??????????2、?在操作符前換行。
??????????3、規則1優先于規則2。
?????當以上規則會導致代碼混亂的時候自己采取更靈活的換行規則。?????
2.3?縮進?
?????縮進應該是每行一個Tab(4個空格),不要在代碼中使用Tab字符。
??Visual?Studio.Net設置:工具->選項->文本編輯器->C#->制表符->插入空格
2.4?空行
空行是為了將邏輯上相關聯的代碼分塊,以便提高代碼的可閱讀性。
在以下情況下使用兩個空行:
???1、接口和類的定義之間。
???2、枚舉和類的定義之間。
???3、類與類的定義之間。??????
在以下情況下使用一個空行:
1、方法與方法、屬性與屬性之間。
2、方法中變量聲明與語句之間。
3、方法與方法之間。
4、方法中不同的邏輯塊之間。
5、方法中的返回語句與其他的語句之間。
6、屬性與方法、屬性與字段、方法與字段之間。
7、注釋與它注釋的語句間不空行,但與其他的語句間空一行。
8、文件之中不得存在無規則的空行,比如說連續十個空行。空行是為了將邏輯上相關聯的代碼分塊,以便提高代碼的可閱讀性。
2.5?空格
在以下情況中要使用到空格:
1、?關鍵字和左括符?“(”?應該用空格隔開。如
???????????while?(true)????
????????注意在方法名和左括符?“(”?之間不要使用空格,這樣有助于辨認代碼中的方法調用與關鍵字。
2、???多個參數用逗號隔開,每個逗號后都應加一個空格。
3、???除了?.?之外,所有的二元操作符都應用空格與它們的操作數隔開。一元操作符、++及--與操作????數間不需要空格。如
???????????a??+=??c??+??d;
???????????a??=??(a??+??b)???/???(c??*??d);
????????????while??(d++??=??s++)
????????????{
????????????????????n++;
????????????}
????????????PrintSize(“size?is?“??+??size??+??“\n”);
4、?語句中的表達式之間用空格隔開。如
for??(expr1;??expr2;??expr3)
2.6?花括號?-?{}
1、?左花括號?“{”?放于關鍵字或方法名的下一行并與之對齊。如
?????????????if?(condition)
?????????????{
?????????????}
?????????????public?int?Add(int?x,?int?y)
?????????????{
?????????????}
2、左花括號?“{”?要與相應的右花括號?“}”對齊。
3、?通常情況下左花括號?“{”單獨成行,不與任何語句并列一行。
4、?if、while、do語句后一定要使用{},即使{}號中為空或只有一條語句。如
?????????????if?(somevalue?==?1)
?????????????{
?????????????????somevalue?=?2;
?????????????}
5、?右花括號?“}”?后建議加一個注釋以便于方便的找到與之相應的?{。如
???????????????while??(1)
???????????????{
???????????????????if??(valid)
???????????????????{
???????????????????}?//?if?valid
???????????????????else
???????????????????{
???????????????????}?//?not?valid
????????????????}?//?end?forever
3?程序注釋
3.1?注釋概述
1)?修改代碼時,總是使代碼周圍的注釋保持最新。
2)?在每個例程的開始,提供標準的注釋樣本以指示例程的用途、假設和限制很有幫助。注釋樣本應該是解釋它為什么存在和可以做什么的簡短介紹.
3)?避免在代碼行的末尾添加注釋;行尾注釋使代碼更難閱讀。不過在批注變量聲明時,行尾注釋是合適的;在這種情況下,將所有行尾注釋在公共制表位處對齊。?
4)?避免雜亂的注釋,如一整行星號。而是應該使用空白將注釋同代碼分開。?
5)?在部署發布之前,移除所有臨時或無關的注釋,以避免在日后的維護工作中產生混亂。
6)?如果需要用注釋來解釋復雜的代碼節,請檢查此代碼以確定是否應該重寫它。盡一切可能不注釋難以理解的代碼,而應該重寫它。盡管一般不應該為了使代碼更簡單以便于人們使用而犧牲性能,但必須保持性能和可維護性之間的平衡。
7)?在編寫注釋時使用完整的句子。注釋應該闡明代碼,而不應該增加多義性。?
8)?在編寫代碼時就注釋,因為以后很可能沒有時間這樣做。另外,如果有機會復查已編寫的代碼,在今天看來很明顯的東西六周以后或許就不明顯了。
9)?避免多余的或不適當的注釋,如幽默的不主要的備注。
10)?使用注釋來解釋代碼的意圖。它們不應作為代碼的聯機翻譯。?
11)?注釋代碼中不十分明顯的任何內容。
12)?為了防止問題反復出現,對錯誤修復和解決方法代碼總是使用注釋。
13)?對由循環和邏輯分支組成的代碼使用注釋。這些是幫助源代碼讀者的主要方面。?
14)?在整個應用程序中,使用具有一致的標點和結構的統一樣式來構造注釋。?
15)?在所有的代碼修改處加上修改標示的注釋。
16)?為了是層次清晰,在閉合的右花括號后注釋該閉合所對應的起點。
????namespace?Langchao.Procument.Web?
{
}?//?namespace?Langchao.Procument.Web
3.2?文檔型注釋
該類注釋采用.Net已定義好的Xml標簽來標記,在聲明接口、類、方法、屬性、字段都應該使用該類注釋,以便代碼完成后直接生成代碼文檔,讓別人更好的了解代碼的實現和接口。如
///<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)?臨時測試屏蔽某些代碼。
用法
?????????/*
[修改標識]
[修改原因]
.?.?.?(the?source?code?)
*/
3.4?單行注釋
該類注釋用于
1)?方法內的代碼注釋。如變量的聲明、代碼或代碼段的解釋。注釋示例:
??????????//
//?注釋語句
??????????//?
?????????private?int?number;
或
?????????//?注釋語句
?????????private?int?number;
2)?方法內變量的聲明或花括號后的注釋,?注釋示例:
???????????????if?(?1?==?1)????//?always?true
???????????????{????
??????????????????statement;?
?????????????????}?//?always?true
4?申明
4.1?每行聲明數
一行只建議作一個聲明,并按字母順序排列。如:
??????????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++)
????????????????{
????????????????????...
????????????????}
應避免不同層次間的變量重名,如:
????????????int?count;
????????????...
void?MyMethod()
{
????????????????if?(condition)
????????????????{
????????????????????int?count?=?0;?????//?避免
?????????????????????...
?????????????????}
?????????????????...
}
4.4?類和接口的聲明
1)?在方法名與其后的左括號間沒有任何空格。
2)?左花括號?“{”?出現在聲明的下行并與之對齊,單獨成行。
3)?方法間用一個空行隔開。??
4.5?字段的聲明
不要使用是?public?或?protected?的實例字段。如果避免將字段直接公開給開發人員,可以更輕松地對類進行版本控制,原因是在維護二進制兼容性時字段不能被更改為屬性。考慮為字段提供?get?和set?屬性訪問器,而不是使它們成為公共的。?get?和?set?屬性訪問器中可執行代碼的存在使得可以進行后續改進,如在使用屬性或者得到屬性更改通知時根據需要創建對象。下面的代碼示例闡釋帶有get?和?set?屬性訪問器的私有實例字段的正確使用。示例:
????????????public?class?Control:?Component
????????????{
???????????????private?int?handle;
???????????????public??int?Handle
???????????????{
??????????????????get
??????????????????{?
?????????????????????return?handle;?
??????????????????}
???????????????}
}
?
5?第五章 命名規范
5.1?命名概述
名稱應該說明“什么”而不是“如何”。通過避免使用公開基礎實現(它們會發生改變)的名稱,可以保留簡化復雜性的抽象層。例如,可以使用?GetNextStudent(),而不是?GetNextArrayElement()。?
命名原則是:
選擇正確名稱時的困難可能表明需要進一步分析或定義項的目的。使名稱足夠長以便有一定的意義,并且足夠短以避免冗長。唯一名稱在編程上僅用于將各項區分開。表現力強的名稱是為了幫助人們閱讀;因此,提供人們可以理解的名稱是有意義的。其實從長變量名的負面作用三,因為Ctrl+C和Ctrl+V加上在VS中的智能感知,其負面追用已經很小。最優秀的代碼它本身就是注釋。作為一流的程序員。并不僅僅實現功能,而是要讓我們的代碼更加優美,具備讓他人維護或今后擴充的能力。作為現在的業務系統,其門檻的準入水平已大大降低,實現功能上的需求已沒有什么難度,但是高手和菜鳥的區別在于,高手的代碼通俗易懂,在整個編碼的過程中,不僅能考慮到性能、還會考慮代碼可讀性和維護性。不過,請確保選擇的名稱符合適用語言的規則和標準。
以下幾點是推薦的命名方法。
1)?避免容易被主觀解釋的難懂的名稱,如命名?AnalyzeThis(),或者屬性名?xxK8。這樣的名稱會導致多義性。
2)?在類屬性的名稱中包含類名是多余的,如?Book.BookTitle。而是應該使用?Book.Title。
3)?只要合適,在變量名的末尾或開頭加計算限定符(Avg、Sum、Min、Max、Index)。
4)?在變量名中使用互補對,如?min/max、begin/end?和?open/close。?
5)?布爾變量名應該包含?Is,這意味著?Yes/No?或?True/False?值,如?fileIsFound。
6)?在命名狀態變量時,避免使用諸如?Flag?的術語。狀態變量不同于布爾變量的地方是它可以具有兩個以上的可能值。不是使用?documentFlag,而是使用更具描述性的名稱,如?documentFormatType。?(此項只供參考)
7)?即使對于可能僅出現在幾個代碼行中的生存期很短的變量,仍然使用有意義的名稱。僅對于短循環索引使用單字母變量名,如?i?或?j。?可能的情況下,盡量不要使用原義數字或原義字符串,如
????For?i?=?1?To?7。而是使用命名常數,如?For?i?=?1?To?NUM_DAYS_IN_WEEK?以便于維護和理解。
8)?文件名要和類名相同,一般情況下一個類一個文件。
5.2?大小寫規則
下表匯總了大寫規則,并提供了不同類型的標識符的示例。
| 標識符 | 大小寫 | 示例 |
| 類 | Pascal | AppDomain |
| 枚舉類型 | Pascal | ErrorLevel |
| 枚舉值 | Pascal | FatalError |
| 事件 | Pascal | ValueChange |
| 異常類 | Pascal | WebException? 注意?總是以?Exception?后綴結尾。 |
| 只讀的靜態字段 | Pascal | RedValue |
| 接口 | Pascal | IDisposable? 注意?總是以?I?前綴開始。 |
| 方法 | Pascal | ToString |
| 命名空間 | Pascal | System.Drawing |
| 屬性 | Pascal | BackColor |
| 公共實例字段 | Pascal | RedValue? 注意?很少使用。屬性優于使用公共實例字段。 |
| 受保護的實例字段 | Camel? | redValue? 注意?很少使用。屬性優于使用受保護的實例字段。 |
| 私有的實例字段 | Camel | redValue |
| 參數 | Camel | typeName |
| 方法內的變量 | Camel | backColor |
5.3?縮寫
為了避免混淆和保證跨語言交互操作,請遵循有關區縮寫的使用的下列規則:?
1)?不要將縮寫或縮略形式用作標識符名稱的組成部分。例如,使用?GetWindow,而不要使用?GetWin。?
2)?不要使用計算機領域中未被普遍接受的縮寫。?
3)?在適當的時候,使用眾所周知的縮寫替換冗長的詞組名稱。例如,用?UI?作為?User?Interface?縮寫,用?OLAP?作為?On-line?Analytical?Processing?的縮寫。?
4)?在使用縮寫時,對于超過兩個字符長度的縮寫請使用?Pascal?大小寫或?Camel?大小寫。例如,使用?HtmlButton?或?HTMLButton。但是,應當大寫僅有兩個字符的縮寫,如,System.IO,而不是?System.Io。
5.4?命名空間
1)?命名命名空間時的一般性規則是使用公司名稱,后跟技術名稱和可選的功能與設計,如下所示。
????????????CompanyName.TechnologyName[.Feature][.Design]
????????例如:
?????????namespace?Langchao.Procurement?????????????//浪潮公司的采購單管理系統
?????????namespace?Langchao.Procurement.DataRules???//浪潮公司的采購單管理系統的業務規則模塊
2)?命名空間使用Pascal大小寫,用逗號分隔開。
3)?TechnologyName?指的是該項目的英文縮寫,或軟件名。
4)?命名空間和類不能使用同樣的名字。例如,有一個類被命名為Debug后,就不要再使用Debug作為一個名稱空間名。??
5.5?類
1)?使用?Pascal?大小寫。
2)?用名詞或名詞短語命名類。
3)?使用全稱避免縮寫,除非縮寫已是一種公認的約定,如URL、HTML????
4)?不要使用類型前綴,如在類名稱上對類使用?C?前綴。例如,使用類名稱?FileStream,而不是?
???CFileStream。?
5)?不要使用下劃線字符?(_)。?
6?、有時候需要提供以字母?I?開始的類名稱,雖然該類不是接口。只要?I?是作為類名稱組成部分的整個單詞的第一個字母,這便是適當的。例如,類名稱?IdentityStore?是適當的。在適當的地方,使用復合單詞命名派生的類。派生類名稱的第二個部分應當是基類的名稱。例如,ApplicationException?對于從名為?Exception?的類派生的類是適當的名稱,原因ApplicationException?是一種Exception。請在應用該規則時進行合理的判斷。例如,Button?對于從?Control?派生的類是適當的名稱。盡管按鈕是一種控件,但是將?Control?作為類名稱的一部分將使名稱不必要地加長。
????????????public?class?FileStream
????????????public?class?Button
public?class?String
????
5.6?接口
以下規則概述接口的命名指南:?
1)?用名詞或名詞短語,或者描述行為的形容詞命名接口。例如,接口名稱?IComponent?使用描述性名詞。接口名稱?ICustomAttributeProvider?使用名詞短語。名稱?IPersistable?使用形容詞。?
2)?使用?Pascal?大小寫。?
3)?少用縮寫。?
4)?給接口名稱加上字母?I?前綴,以指示該類型為接口。在定義類/接口對(其中類是接口的標準實現)時使用相似的名稱。兩個名稱的區別應該只是接口名稱上有字母?I?前綴。?
5)?不要使用下劃線字符?(_)。?
6)?當類是接口的標準執行時,定義這一對類/接口組合就要使用相似的名稱。兩個名稱的不同之處只是接口名前有一個I前綴。
以下是正確命名的接口的示例。
????????????????public?interface?IServiceProvider
????????????????public?interface?IFormatable
以下代碼示例闡釋如何定義?IComponent?接口及其標準實現?Component?類。
???????????????public?interface?IComponent?
???????????????{
???????????????????//?Implementation?code?goes?here.
???????????????}
???????????????
???????????????public?class?Component:?IComponent?
???????????????{
???????????????????//?Implementation?code?goes?here.
}
5.7?屬性?(Attribute)
應該總是將后綴?Attribute?添加到自定義屬性類。以下是正確命名的屬性類的示例。
??????????public?class?ObsoleteAttribute
??????????{
}???
5.8?枚舉?(Enum)
枚舉?(Enum)?值類型從?Enum?類繼承。以下規則概述枚舉的命名指南:?
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?參數
以下規則概述參數的命名指南:?
1)?使用描述性參數名稱。參數名稱應當具有足夠的描述性,以便參數的名稱及其類型可用于在大多數情況下確定它的含義。?
2)?對參數名稱使用?Camel?大小寫。?
3)?使用描述參數的含義的名稱,而不要使用描述參數的類型的名稱。開發工具將提供有關參數的類型的有意義的信息。因此,?通過描述意義,可以更好地使用參數的名稱。少用基于類型的參數名稱,僅在適合使用它們的地方使用它們。
4)?不要給參數名稱加匈牙利語類型表示法的前綴。?
以下是正確命名的參數的示例。
???????????????Type?GetType(string?typeName)
string?Format(string?format,?args()?As?object)
5.10?方法
以下規則概述方法的命名指南:?
1)?使用動詞或動詞短語命名方法。?
2)?使用?Pascal?大小寫。?
3)?以下是正確命名的方法的實例。
??????????????RemoveAll()
??????????????GetCharArray()
??Invoke()
5.11?屬性?(property)
以下規則概述屬性的命名指南:?
1)?使用名詞或名詞短語命名屬性。?
2)?使用?Pascal?大小寫。?
3)?不要使用匈牙利語表示法。?
4)?考慮用與屬性的基礎類型相同的名稱創建屬性。例如,如果聲明名為?Color?的屬性,則屬性的類型同樣應該是?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?事件
以下規則概述事件的命名指南:?
1)?對事件處理程序名稱使用?EventHandler?后綴。?
2)?指定兩個名為?sender?和?e?的參數。sender?參數表示引發事件的對象。sender?參數始終是object?類型的,即使在可以使用更為特定的類型時也如此。與事件相關聯的狀態封裝在名為?e?的事件類的實例中。對?e?參數類型使用適當而特定的事件類。?
3)?用?EventArgs?后綴命名事件參數類。?
4)?考慮用動詞命名事件。?
5)?使用動名詞(動詞的“ing”形式)創建表示事件前的概念的事件名稱,用過去式表示事件后。例如,可以取消的?Close?事件應當具有?Closing?事件和?Closed?事件。不要使用BeforeXxx/AfterXxx?命名模式。?
6)?不要在類型的事件聲明上使用前綴或者后綴。例如,使用?Close,而不要使用?OnClose。?
7)?通常情況下,對于可以在派生類中重寫的事件,應在類型上提供一個受保護的方法(稱為?OnXxx)。此方法只應具有事件參數?e,因為發送方總是類型的實例。?
以下示例闡釋具有適當名稱和參數的事件處理程序。
????????????public?delegate?void?MouseEventHandler(object?sender,?MouseEventArgs?e);
以下示例闡釋正確命名的事件參數類。
????????????????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?字段
以下規則概述字段的命名指南:?
1)?private、protected?使用?Camel?大小寫。
2)?public?使用?Pascal?大小寫。
3)?拼寫出字段名稱中使用的所有單詞。僅在開發人員一般都能理解時使用縮寫。字段名稱不要使用大寫字母。下面是正確命名的字段的示例。?
????????????????class?SampleClass?
????????????????{
????????????????????string?url;
?????????????string?destinationUrl;
}
4)?不要對字段名使用匈牙利語表示法。好的名稱描述語義,而非類型。?
5)?不要對字段名或靜態字段名應用前綴。具體說來,不要對字段名稱應用前綴來區分靜態和非靜態字段。例如,應用?g_?或?s_?前綴是不正確的。?
5.15?靜態字段
以下規則概述靜態字段的命名指南:?
1)?使用名詞、名詞短語或者名詞的縮寫命名靜態字段。?
2)?使用?Pascal?大小寫。?
3)?對靜態字段名稱使用匈牙利語表示法前綴。?
4)?建議盡可能使用靜態屬性而不是公共靜態字段。?
5.16?集合
集合是一組組合在一起的類似的類型化對象,如哈希表、查詢、堆棧、字典和列表,集合的命名建議用復數。
5.17?范型
如果你對類型參數沒有其他的跟上下文有關的信息(additional?contextual?information),你應該使用字母T:
5.18?措詞
避免使用與常用的?.NET?框架命名空間重復的類名稱。例如,不要將以下任何名稱用作類名稱:
System、Collections、Forms?或?UI。有關?.NET?框架命名空間的列表,請參閱類庫。
另外,避免使用和以下關鍵字沖突的標識符。
| 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?復合語句
復合語句是指包含"父語句{子語句;子語句;}"的語句,使用復合語句應遵循以下幾點:
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.10?using?塊語句??????
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)?方法名需能看出它作什么。別使用會引起誤解的名字。如果名字一目了然,就無需用文檔來解釋方法的功能了。
好:?
不好:?
6)?程序編碼力求簡潔,結構清晰,避免太多的分支結構及太過于技巧性的程序。
7)?避免采用過于復雜的條件測試,避免過多的循環嵌套和條件嵌套。?
8)?盡量使用.NET庫函數和公共函數(無特殊情況不要使用外部方法調用windows的核心動態鏈接庫API)。
9)?不要隨意定義全局變量,聲明局部變量,并傳遞給方法。不要在方法間共享成員變量。如果在幾個方法間共享一個成員變量,那就很難知道是哪個方法在什么時候修改了它的值。?
10)?別在程序中使用固定數值,用常量代替。
8.2?結構書寫規范
1)?把所有系統框架提供的名稱空間組織到一起,把第三方提供的名稱空間放到系統名稱空間的下面
| void?SavePhoneNumber?(?string?phoneNumber?)? |
| //?This?method?will?save?the?phone?number.? |
2)?所有的類成員變量應該被聲明在類的頂部,并用一個空行把它們和方法以及屬性的聲明區分開
| 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?。別用數字或字符串來指示離散值。?
好:?
不好:?
5)?一個方法只完成一個任務。不要把多個任務組合到一個方法中,即使那些任務非常小。
好:?
| 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)?使用括號清晰地表達算術表達式和邏輯表達式的運算順序。如將?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?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)?避免利用返回值作為函數的錯誤代碼,應該在程序中使用異常來處理錯誤。
10?其他
10.1?類型轉換
1)?盡量避免強制類型轉換。
2)?如果不得不做類型轉換,盡量使用as關鍵字安全的轉換到另一個類型。
?
10.2?正確性與容錯性要求
1)?程序首先是正確,其次是優美
2)?無法證明你的程序沒有錯誤,因此在編寫完一段程序后,應先回頭檢查。
3)?改一個錯誤時可能產生新的錯誤,因此在修改前首先考慮對其它程序的影響。
4)?對所有的用戶輸入,必須進行合法性檢查。
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關鍵字。
| void?ReadFromFile?(?string?fileName?)? |
| void?ReadFromFile?(?string?fileName?)? |
11)?不要使用base關鍵字訪問基類的成員,除非你在調用一個基類構造函數的時候要解決一個子類的名稱沖突
| 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)?生成和構建一個長的字符串時,一定要使用StringBuilder,而不用string。
轉載于:https://www.cnblogs.com/makewong/archive/2010/04/28/1722678.html
總結
以上是生活随笔為你收集整理的实用C#编程规范(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net框架读书笔记---引用参数(re
- 下一篇: 针对$_SERVER[’PHP_SELF