DotNet 开发规范.docx
- 文档编号:12528298
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:27
- 大小:31.13KB
DotNet 开发规范.docx
《DotNet 开发规范.docx》由会员分享,可在线阅读,更多相关《DotNet 开发规范.docx(27页珍藏版)》请在冰点文库上搜索。
DotNet开发规范
.NET開發規範
文檔修訂:
魏煥森
日期:
2008-6-15
富士康科技集團
目录
1、導言4
1.1目的4
1.2適用範圍4
1.3參考資料4
1.4版本更新記錄4
2、命名規範5
2.1大小寫約定5
2.2首字母縮寫詞的大小寫6
2.3程式集和DLL的命名6
2.4命名空間命名規則6
2.5類、結構和接口的命名7
2.6枚舉類型的命名7
2.7類型成員的命名8
2.7.1方法的命名8
2.7.2屬性的命名8
2.7.3事件的命名8
2.7.4參數的命名9
2.7.5字段的命名9
2.8資源的命名9
2.9控件的命名10
2.10通用命名約定(小結)10
3、C#編程風格約定11
3.1花括號的使用11
3.2空格的使用11
3.3縮進的使用12
3.4注釋12
3.5文件的組織14
4、開發建議15
4.1多用using語句15
4.2盡量減少服務器控件的數量15
4.3使用驗證控件15
4.4使用存儲過程16
4.5采用參數化SQL16
4.6用OpenXML進行批量插入(SqlServer)16
4.7采用StringBuilder17
4.8用泛型集合替代普通集合17
4.9采用存儲過程分頁17
4.10發掘基類潛能18
4.11多語言首選資源文件19
1、導言
1.1目的
本文檔是為基於Microsoft®公司的VisualStudio.Net®-C#.Net系列開發工具進行軟體開發的一個規範性文件,其目的是:
✧保證軟體開發過程中有一個統一的標準可以進行參照;
✧能夠合理的使用公用資源。
1.2適用範圍
.NET程式開發。
1.3參考資料
1.《.NET設計規範》
1.4版本更新記錄
版本/修訂版
修改確認日期
修改內容概述
起草人
審核人
備注
1.0
2007-11
初始版本
魏煥森
1.0
2008-06
修改
2、命名規範
在軟體的開發過程中遵循一組一致的命名約定對代碼的可讀性和維護有著重大的作用,在進行命名時,除了形式上的一致性,代碼中元素的名字必須易於理解,同時必須傳達每個元素的功能。
2.1大小寫約定
標識符大小寫的約定,采取以下兩種規則:
✧PascalCasing:
把標識符中每個單詞的首字母(包括長度為兩個字元以上的首字母縮寫詞)大寫,如:
PropertyDescriptor,HtmlTag。
✧camelCasing:
把標識符中除了第一個單詞之外的所有單詞的首字母大寫,如:
propertyDescriptor,htmlTag。
不同類型標識符的大小寫規則:
標識符
大小寫規則
樣例
名字空間
PascalCasing
NamespaceSystem.Text{…}
類型
PascalCasing
publicclassStreamReader{…}
接口
PascalCasing
publicinterfaceIList{…}
方法
PascalCasing
publicclassObject{
publicvirtualstringToString();
}
屬性
PascalCasing
publicclassString{
publicintLength{get;}
}
事件
PascalCasing
publicclassProcess{
publiceventEventHandlerExited;
}
字段(靜態)
PascalCasing
publicclassProductInfo{
publicstaticreadonlystringCategoryId;
}
字段(非靜態)
camelCasing
publicclassProductInfo{
privatestringcategoryId;
}
枚舉
PascalCasing
FileMode{
Append,
…
}
參數
camelCasing
publicclassConvert{
publicstaticintToint32(stringvalue);
}
局部變量
camelCasing
privatestringcategoryId;
常量
全部大寫
privateconststringSPNAME="spUserList";
2.2首字母縮寫詞的大小寫
首字母縮寫詞與單詞縮寫是有區別的,首字母縮寫詞是由一個短語的首字母組成的,而單詞縮寫則僅僅把一個單詞的長度變短。
應避免在標識符的名字中使用首字母縮寫,除非他們是普遍使用的,能立即被人所理解,如HTML,XML、UI和IO等,出於可讀性原則,不怎麽常用的首字母縮寫詞應該避免。
✧如果首字母縮寫詞只有兩個字母,則要全部大寫,除非它是camelCasing規則的名稱,如:
System.IO
publicvoidStartIO(StreamioStream)
✧要把由三個或三個以上字母組成的首字母縮寫詞的第一個字母大寫,除非是camelCasing規則的名稱,如:
System.Xml
publicvoidProcessHtmlTag(stringhtmlTag)
✧不要把camelCasing規則的任何首字母縮寫詞的首字母大寫,無論首字母縮寫詞的長度是多少;
✧在适当的时候,使用众所周知的缩写替换冗长的词组名称。
例如,用UI作为UserInterface的缩写;用HTML作为HypertextMarkupLanguage的缩写。
✧如果命名涉及到一些商標或公司名稱,如FOXCONN、IBM等,則大小寫規則應以商標為准,不受以上規則限制。
2.3程式集和DLL的命名
✧要為程式集和dll選擇提示性的名字,比如System.Data,這樣很容易就知道它的大致功能。
✧程式集和DLL的名字不一定要和命名空間相對應,但在給程式集命名時遵循命名空間的名字也是一種常見的做法。
✧按照下面的模式給DLL命名:
其中
Microsoft.VisualBasic.dll
Microsoft.VisualBasic.Vsa.dll
2.4命名空間命名規則
在設計一個大型的框架之前,應該決定如何將功能劃分到一組功能域中,這些功能域由命名空間表示。
定義命名空間應遵循的一般規則:
例如:
FOXCONN.ECS.VMI.Model
Microsoft.VisualStudio
Microsoft.VisualStudio.Design
✧要使用PascalCasing規則,並用點號來分隔命名空間的各部分,例如Microsoft.Office.Word2007。
✧要用公司的名稱作為命名空間的前綴,如果公司的商標的大小寫與以上規則相背,應遵循商標的大小寫風格,如IBM.Lotus;
✧要用穩定的,與版本無關的産品名稱作為命名空間的第二層,例如微軟的MicrosoftOffice應該以Microsoft.Office作為命名空間;
✧不要根據公司的組織架構來決定命名空間的層次結構,因為公司內部組織的名稱或架構有可能會經常變動;
✧不要用相同的名字來給命名空間與位於該命名空間中的類命名。
例如,不要將命名空間命名為Product,然後又在該命名空間中創建一個名為Product的類。
許多編譯器要求用戶在使用這樣的類時要加上完整的限定符;
2.5類、結構和接口的命名
✧使用PascalCasing規則;
✧盡量用名詞或名詞詞組來給類型命名;
✧不要給類名加前綴,例如“C_ProductInfo”;
✧考慮讓派生類的名字以基類的名字結尾,如:
publicclassFileStream:
Stream{…}
✧接口的名字應以字母I開頭,並確保一對類/接口的名字只相差一個“I”前綴,如果該類是該接口的具體實現,如:
publicinterfaceIComponent{…}
publicclassComponent:
IComponent{…}
2.6枚舉類型的命名
✧要用單數名詞來命名枚舉類型,例如:
publicenumBackColor{
Black,
Blue,
Cyan,
…
}
✧不要給枚舉類型的名字添加“Enum”、“Flag”、“Flags”等後綴;
✧不要給枚舉類型的名字添加任何前綴,例如給CommandType枚舉類型加“ct”前綴等。
不好的枚舉類型命名:
publicenumImageMode{
ImageModeBitmap=0,
ImageModeGrayScale=1,
ImageModeIndexed=2,
ImageModeRgb=3,
}
采用以下命名會更好:
publicenumImageMode{
Bitmap=0,
GrayScale=1,
Indexed=2,
Rgb=3,
}
2.7類型成員的命名
類型由方法、屬性、事件、構造函數以及字段等成員組成。
一般來說,類型名應該是名詞或名詞詞組,因為它們代表系統中的實體。
2.7.1方法的命名
✧使用PascalCasing規則;
✧因為方法是用來執行操作的,因此框架設計的規範要求方法名必須是動詞或動詞詞組,並且盡量 用方法所對應的任務來給它們命名,而不要根據一些實現細節。
如:
publicclassString{
publicintCompareTo(…)
publicstring[]Split(…)
publicstringTrim();
}
2.7.2屬性的命名
✧使用PascalCasing規則;
✧要用名詞或名詞詞組或形容詞來命名屬性,這是因為屬性代表數據,因此它的名字應該反映出這一點;
✧要用肯定性的短語來命名布爾屬性,還可以有選擇地給布爾屬性添加“Is”、“Can”、“Has”等前綴;
✧命名屬性時不要采用“Get”、“Set”等動詞作為前綴;
✧考慮用屬性的類型名來命名屬性。
例如,下面這個屬性的作用是獲取或設置一個名為Color的枚舉值,因此它被命名為Color:
PublicenumColor{…}
PublicclassControl{
PublicColorColor{get{…}set{…}}
}
2.7.3事件的命名
✧使用PascalCasing規則;
✧事件總是表示一些動作,要麽是正在發生的,要麽是已經發生的。
因此,事件和方法一樣,要用動詞或動詞詞組來命名,除此之外,還要用動詞的時態來表示事件發生的時間。
✧要用現在時和過去時賦予事件名以之前和之後的概念,例如,在窗口關閉之前發生的close事件應該命名為Closing,而在窗口關閉之後發生的應該命名為Closed;
✧不要用“Before”或“After”前綴或後綴來區分前置事件和後置事件;
✧要在事件處理函數中用sender和e作為兩個參數的名字。
參數sender表示觸發該事件的對象,雖然參數sender可以是一個更為具體的類型,但一般來說其類型就是Object,整個.NET框架一致地使用了這種模式;
✧要在命名事件處理函數(用作事件類型的委托)時加上“EventHandler”後綴,例如:
publicdelegatevoidClickedEventHandler(objectsender,ClickedEventArgse);
✧要在命名事件的參數類時加上“EventArgs”後綴,例如:
publicclassClickedEventArgs:
EventArgs{
Intx;
Inty;
publicClickedEventArgs(intx,inty){
this.x=x;
this.y=y;
}
publicintX{get{returnx;}}
publicintY{get{returny;}}
}
2.7.4參數的命名
✧使用camelCasing規則;
✧參數名應該具備足夠的描述性,在大多數情況下,用戶根據參數的名字和類型就能夠確定它的意思;
✧考慮根據參數的意思而不是參數的類型來命名參數,例如:
publicclassString{
publicboolContains(stringvalue);
publicstringRemove(intstartIndex,intcount);
}
2.7.5字段的命名
✧對於類型中的私有字段,應該采用camelCasing規則;如:
privatestringuserName;
✧對於類型中的靜態字段,采用PascalCasing規則,如:
publicclassString{
publicstaticreadonlystringEmpty;
}
✧對於常量,名字應全部大寫,如:
privateconststringSPNAME="spUserList";
✧要用名詞或名詞詞組來命名字段;
✧建議使用屬性而不是公共字段。
2.8控件的命名
✧采用PascalCasing規則;
✧控件的命名規則是:
控件名稱+該控件的功能描述。
例如一個更新操作的按鈕叫ButtonUpdate。
2.9通用命名約定(小結)
✧要為標識符選擇易於閱讀的名字。
對名字來說,很重要的一點是要一目了然。
標識符的名字應該能清楚地說明每個成員做什麽,以及每個類型和參數表示什麽,為此,名字的含義清楚要比長度短更重要。
名字應該與場景、系統或業務的邏輯相對應,而不應該與技術或框架相對應。
總體來說,要看重可讀性,而不是看重簡短性;
✧不要使用下劃線,連字符以及其他任何既非字母也非數位的字元;
✧不要使用匈牙利命名法,也就是說,不要在變量中包含變量的類型;
✧避免使用與語言自身的關鍵字有沖突的名字。
雖然C#允許通過@與關鍵字結合作為名字,但應該避免這種做法;
✧盡量不要使用縮寫詞作為名字的一部分,例如要用GetDataSet,而不要用GetDS;
✧要使用語義上有意義的名字,而不要使用語言特有的關鍵字,例如要用GetLength,而不要用GetInt;
✧不要使用未被廣泛使用的首字母縮寫詞;
✧不要创建字符相同僅是大小写有区别的名字,包括命名空間,類,方法,接口,方法參數等,盡管C#是區別大小寫的。
例如創建一個類叫Product,創建另一個類叫product,這樣容易造成混淆。
3、C#編程風格約定
3.1排版
3.1.1對齊或縮進的空格數為4個,應只采用空格鍵,而不用TAB鍵。
說明:
以免用不同的編輯器閱讀時,因TAB鍵所設置的空格數目不同而造成程式布局不整齊。
3.1.2較長的語句(>80字符)要分成多行書寫,長表達式要在低優先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進行適當的縮進,使排版整齊,語句可讀。
if(string.IsNullOrEmpty(TextBoxVendorCode.Text.Trim())
&&!
string.IsNullOrEmpty(TextBoxVendorName.Text.Trim()))
{
...//programcode
}
3.1.3不允許把多個短語句寫在一行中,即一行只写一条语句。
如下句子不符合規範:
intlength=0;intwidth=0;
應如下書寫:
intlength=0;
intwidth=0;
3.1.4if、for、do、while、case、switch、default等語句自占一行,且if、for、do、while等語句的執行語句部分無論多少都要加大括號{}。
如下例子不符合規範:
if(Session[“UserID”]==NULL)return;
應如下書寫:
if(Session[“UserID”]==NULL)
{
return;
}
3.1.5應避免在代碼中留有空白行。
3.2注釋
應該用注釋來描述代碼的用意、大致的算法以及邏輯流程,以方便除了代碼編寫者之外的人能夠通過獨自閱讀注釋來理解代碼的行為和目的,一般情况下,源程序有效注释量必须在20%以上。
✧在每個cs文件的上方寫上該文件的功能描述、代碼編寫人、編寫日期等注釋,以方便代碼的維護及責任認定,例如:
/**********************************************************************************
*功能描述:
业务层基类,所有业务层的class都必须继承此类(有需要时可在此基类进行扩展)
*代码编写:
魏焕森
*编写日期:
2007-8-8
*
**********************************************************************************/
✧在每個類的上方應寫上摘要性描述。
在開發過程中用到此類時,開發人員可將鼠標移至該類上方,通過.NETIntellisense功能intelligence?
,方便開發人員快速獲悉該類的功能。
例如:
///
///业务层基类,所有业务层的class都必须继承此类(有需要时可在此基类进行扩展)
///
publicabstractclassBizObject{
…
}
✧在代碼較多的情況下,應使用預處理關鍵字#region/#endregion將類的各個部分進行合理的劃分,以保持代碼整潔、方便維護和閱讀。
例如:
publicstaticclassWebUtility{
#region變量定義
…
#endregion
#region获取资源信息
…
#endregion
…
}
✧應該對每個方法的功能及其參數進行描述,例如:
///
///功能:
填充数据到DataSet
///作者:
魏煥森
///舉例:
DataSetDS=GetDataSet(sql,CommandType.Text,paraName,paraValue);
///
///
///
///
///
///
publicstaticDataSetGetDataSet(stringcommandText,CommandTypecommandType,
string[]parameterName,object[]parameterValue){
…
}
在类的内部,对于方法的声明,要求注释应该至少包含
✧應該對每個屬性進行描述,以方便開發人員快速獲悉該屬性作用。
例如:
///
///设置或获取公告标题
///
publicstringCaption{
get{returnnoticeCaption;}
set{noticeCaption=value;}
}
✧如果非代碼原作者要對代碼進行修改,請務必在代碼修改處進行注釋,注明這是由誰修改的,修改的日期,修改的目的;
✧不要用注釋來描述一些對任何人都顯而易見的事;
✧避免使用塊注釋語法(/*…*/)。
即使注釋會有多行,也最好使用單行注釋語法(//…),例如:
//weuseatry/catchherebecauseifthemethodthrowsanexceptionwewantto
//closetheconnectionthrowcode,becausenodatareaderwillexist,hencethe
//commandBehaviour.CloseConnectionwillnotwork
✧不要把注釋放在行尾,除非注釋非常短。
3.3文件的組織
✧要用相同的名字來命名源文件及其包含的公用類型,例如:
String類應該放在String.cs文件中,而List
✧要用相同的層次結構來組織文件目錄和命名空間。
例如:
應該把System.Collections.Generic.List
✧應該給每一個獨立的功能模組創建一個文件夾,該文件夾只存放該模組的相關文件,如cs、 aspx等文件,切忌將整個系統的所有文件存在某一個目錄中。
開發建議
4.1多用using語句
✧Using语句获取的每个资源变量的范围仅限于Using块;
✧即時回收資源;
✧只要所調用的類繼承了IDisposable接口(即實現Dispose方法),其實例都可包含在using塊中,一旦離開using塊,將自動調用該對象的Dispose方法,以釋放資源。
例如:
using(SqlConnectionconnection=newSqlConnection(ConnectionString)){
…
}
該語句一旦離散using塊,將自動關閉數據庫連接(放入連接池),釋放連接資源,該語句與以下語句功能一樣,但采用using語句將使代碼更簡潔,更富技巧性。
SqlConnectionconnection=newSqlConnection(ConnectionString);
try{
…
}
catch{
…
}
finally
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DotNet 开发规范 开发 规范
![提示](https://static.bingdoc.com/images/bang_tan.gif)