




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文檔描述了微軟ー站式代碼示例庫項(xiàng)冃組所采納的關(guān)于本地C++和.NET(C#和VB.NET)代碼的編程風(fēng)格指導(dǎo)規(guī)范。鳴謝本文檔的每一章節(jié)都應(yīng)該感謝DanRuder-微軟PrincipalEscalationEngineer。Dan對(duì)本文檔進(jìn)行了斟字酌句的查閱,并根據(jù)其20余年的編程經(jīng)驗(yàn)提供了大量的珍貴評(píng)論。我很榮幸能與他共事。我同樣感謝微軟的四位經(jīng)理,感謝他們對(duì)該項(xiàng)目的ー貫支持。他們是VivianLuo,AllenDing,FelixWu和MeiLiang?同時(shí),如果沒有如下ー站式代碼示例庫項(xiàng)目的關(guān)鍵成員的辛勤付出,本文檔必定不會(huì)具有現(xiàn)在的技術(shù)深度以及完整度,我在這里要感謝他們:HongyeSun JieWang JiZhou MichaelSunKiraQian LindaLiuAllenChen Yi-LunLuo StevenChengWen-JunZhang本文檔部分章節(jié)參考自ー些微軟產(chǎn)品組的編程規(guī)范。感謝他們的慷慨共享。本編程規(guī)范在不斷改善。如果您發(fā)現(xiàn)某些最佳實(shí)踐或者話題并沒有涵蓋在本文檔中,請(qǐng)告知我們ー站式示例代碼庫項(xiàng)目組,以不斷充實(shí)改善本文檔。我期待著您的參與。@聲明本編程規(guī)范文檔以“如是”提供,無論明示或暗示都不包含任何形式保證,但并不限制適用于特殊目的的默認(rèn)擔(dān)保。當(dāng)您編寫VC++/VC#/VB.NET代碼時(shí),敬請(qǐng)參考或使用本文檔。但是,我們希望您能通過onecode@告知我們您正在使用本文檔,或給出任何改進(jìn)建議。目錄TOC\o"1-5"\h\z\o"CurrentDocument"1概覽 1\o"CurrentDocument"原則和主旨 1\o"CurrentDocument"術(shù)語 22通用編程規(guī)范 明確和一致 3格式和風(fēng)格 3庫的使用 4\o"CurrentDocument"全局變量 4\o"CurrentDocument"變量的聲明和初始化 5\o"CurrentDocument"函數(shù)的聲明和調(diào)用 5\o"CurrentDocument"語句 6\o"CurrentDocument"枚舉 7\o"CurrentDocument"空格 10\o"CurrentDocument"大括號(hào) 11\o"CurrentDocument"注釋 11\o"CurrentDocument"代碼塊 18\o"CurrentDocument"3C++編程規(guī)范 19編譯器選項(xiàng) 19文件和結(jié)構(gòu) 20命名規(guī)范 21\o"CurrentDocument"指針 23\o"CurrentDocument"常量 23\o"CurrentDocument"類型轉(zhuǎn)換 24\o"CurrentDocument"Sizeof 24\o"CurrentDocument"字符串 25數(shù)組 26\o"CurrentDocument"宏 26函數(shù) 27結(jié)構(gòu)體 29類 錯(cuò)誤!未定義書簽。COM 34\o"CurrentDocument"動(dòng)態(tài)分配 35\o"CurrentDocument"錯(cuò)誤和異常 35\o"CurrentDocument"資源清理 37控制流 38\o"CurrentDocument"4.NET編碼規(guī)范 41\o"CurrentDocument"類庫開發(fā)設(shè)計(jì)規(guī)范 41\o"CurrentDocument"文件和結(jié)構(gòu) 41\o"CurrentDocument"程序集屬性 41命名規(guī)范 41\o"CurrentDocument"常量 43\o"CurrentDocument"字符串 43\o"CurrentDocument"數(shù)組和集合 44\o"CurrentDocument"結(jié)構(gòu)體 46\o"CurrentDocument"類 47\o"CurrentDocument"命名空間 50錯(cuò)誤和異常 50\o"CurrentDocument"資源清理 52交互操作 611概覽本文檔為ー站式示例代碼庫項(xiàng)目組所使用的C++以及.NET編碼規(guī)范。該規(guī)范源自于產(chǎn)品開發(fā)過程中的經(jīng)驗(yàn),并在不斷完善。如果您發(fā)現(xiàn)ー些最佳實(shí)踐或者話題并沒有涵蓋在本文檔中,請(qǐng)聯(lián)系我們ー站式示例代碼庫項(xiàng)目組,以不斷充實(shí)完善本文檔。任何指導(dǎo)準(zhǔn)則都可能會(huì)眾口難調(diào)。本規(guī)范的目的在于幫助社區(qū)開發(fā)者提高開發(fā)效率,減少代碼中可能出現(xiàn)的bug,并增強(qiáng)代碼的可維護(hù)性。萬事開頭難,采納ー個(gè)不熟悉的規(guī)范可能在初期會(huì)有一些棘手和困擾,但是這些不適應(yīng)很快便會(huì)消失,它所帶來的好處和優(yōu)勢很快便會(huì)顯現(xiàn),特別是在當(dāng)您接手他人代碼時(shí)。1.1原則和主旨高質(zhì)量的代碼示例往往具有如下特質(zhì):1.易懂一代碼示例必須易讀且簡單明確。它們必須能展示出重點(diǎn)所在。示例代碼的相關(guān)部分應(yīng)當(dāng)易于重用。示例代碼不可包含多余代碼。它們必須帶有相應(yīng)文檔說明。.正確性一示例代碼必須正確展示出其欲告知使用者的重點(diǎn)。代碼必須經(jīng)過測試,且可以按照文檔描述進(jìn)行編譯和運(yùn)行。.一致性一示例代碼應(yīng)該按照一致的編程風(fēng)格和設(shè)計(jì)來保證代碼易讀。同樣的,不同代碼示例之間也應(yīng)當(dāng)保持一致的風(fēng)格和設(shè)計(jì),使使用者能夠很輕松的結(jié)合使用它們。一致性將我們ー站式示例代碼庫優(yōu)良的品質(zhì)形象傳遞給使用者,展示出我們對(duì)于細(xì)節(jié)的追求。.流行性一代碼示例應(yīng)當(dāng)展示現(xiàn)行的編程實(shí)踐,例如使用Unicode,錯(cuò)誤處理,防御式編程以及可移植性。示例代碼應(yīng)當(dāng)使用當(dāng)前推薦的運(yùn)行時(shí)庫和API函數(shù),以及推薦的項(xiàng)口和生成設(shè)置。.可靠性一代碼示例必須符合法律,隱私和政策標(biāo)準(zhǔn)和規(guī)范。不允許展示入侵性或低質(zhì)的編程實(shí)踐,不允許永久改變機(jī)器狀態(tài)。所有的安裝和執(zhí)行過程必須可以被撤銷。.安全性-示例代碼應(yīng)該展示如何使用安全的編程實(shí)踐:例如最低權(quán)限原則,使用運(yùn)行時(shí)庫函數(shù)的安全版本,以及SDL推薦的項(xiàng)目設(shè)置。合理使用編程實(shí)踐,設(shè)計(jì)和語言特性決定了示例代碼是否可以很好滿足上述特性。本編程規(guī)范致カ于幫助您創(chuàng)建代碼示例以使使用者能夠作為最佳實(shí)踐來效仿和學(xué)習(xí)。1.2術(shù)語在整個(gè)文檔中,會(huì)有一些對(duì)于標(biāo)準(zhǔn)和實(shí)踐的推薦和建議。ー些實(shí)踐是非常重要的,必須嚴(yán)格執(zhí)行,另ー些指導(dǎo)準(zhǔn)則并不一定處處適用,但是會(huì)在特定的場景下帶來益處。為了清楚陳述規(guī)范和實(shí)踐的意圖,我們會(huì)使用如下術(shù)語。術(shù)語1意圖理由0一定請(qǐng)…該規(guī)范或?qū)嵺`在任何情況下都應(yīng)該遵守。如果您認(rèn)為您的應(yīng)用是例外,則可能不適用。該規(guī)范用于減少bug。図一定不要…不允許應(yīng)用該規(guī)范或?qū)嵺`。マ您應(yīng)該…該規(guī)范和實(shí)踐適用于大多數(shù)情況。該規(guī)范用于統(tǒng)?編程風(fēng)格,保持?致和清E您不應(yīng)該..不應(yīng)該應(yīng)用該規(guī)范或?qū)嵺`,除非有合理的理由。晰的風(fēng)格。區(qū)您可以…該標(biāo)準(zhǔn)和規(guī)范您可以按需應(yīng)用。該規(guī)范可用于編程風(fēng)格,但不總是有益的。FileExtension>AllLanguagesFileExtension>AllLanguages>Basic>C#-C/C?*GeneralTabsFormatting>CSSt>HTMLJScript>PL/SQLt>PlainText>SQLScript>T-SQLT-SQL7T-SQL80T-SQL90hXAML2通用編程規(guī)范這些通用編程規(guī)范適用于所有語言-它們對(duì)代碼風(fēng)格,格式和結(jié)構(gòu)提供了全局通用的指導(dǎo)。明確性和一致性図一定請(qǐng)確保代碼的明確性,易讀性和透明性。編程規(guī)范致カ于確保代碼是易懂和易維護(hù)的。沒有什么勝于清晰、簡潔、自描述的代碼。図一定請(qǐng)確保一旦應(yīng)用了某編程規(guī)范,需在所有代碼中應(yīng)用,以保持一致性。格式和風(fēng)格図一定不要使用制表符。不同的文字編輯器使用不同的空格來生成制表符,這就帶來了格式混亂。所有代碼都應(yīng)該使用4個(gè)空格來表示縮進(jìn)。可以配置VisualStudio文字編輯器,以空格代替制表符。OptionsIndentingCNone€Block?SmartTabTabsize 4Indentsize 4@InsertspacesKeeptabs0您應(yīng)該限制一行代碼的最大長度。過長的代碼降低了代碼易讀性。為了提高易讀性,將代碼長度設(shè)置為78歹リ。若78列太窄,可以設(shè)置為86或者90。VisualC++sample://Getanddisplaywhethertheprimaryaccesstokenof//belongstouseraccountthatisamemberoftheloca//groupevenifitcurrentlyisnotelevated(IsUserlaHWNDhlnAdminGroupLabel=GetDlgItem(hWndrIDC-INADMINGltry{BOOLconstflnAdminGroup=IsUserlnAdminGroupO;SetWindowText(hlnAdminGroupLabel,flnAdminGroup?L}catch(DWORDdwError)(SetWindowText(hlnAdminGroupLabel,L"N/A");ReportError(LwIsUserInAdminGroupw,dwError);VisualC#示例:Page4Page4//GetanddisplaywhethertheprimaryaccesstOptions//touseraccountthatisamemberoftheloca//ifitcurrentlyisnotelevated(IsUserlnAdntry(//touseraccountthatisamemberoftheloca//ifitcurrentlyisnotelevated(IsUserlnAdntry(boolflnAdminGroup=IsUserlnAdminGroupO;this.IblnAdminGroup.Text=flnAdminGroup.To}catch(Exceptionex)(this.IblnAdminGroup.Text="N/Aw;MessageBox.Show(ex.Message,"AnerroroccurMessageBoxButtons.0KfMessageBoxIccr.Er)VisualBasicsample:,Getanddisplaywhethertheprimaryaccesstc,touseraccountthatisamemberofthelocaljEnvironmentGeneralAdd-in/MacrosSecurityAutoRecoverDocumentsFindandReplaceFontsandColors>HelpImportandExportSettingsInternationalSettingsKeyboardStartupTaskListWebBrowserPerformanceToolsProjectsandSolutions?SourceControl,TextEditorGeneralShowsettingsforTextEditorFont(boldtypeindicatesfixed-widthfonts):CourierNewDisplayitems: ItPlainTextSelectedTextInactiveSelectedTextIndicatorMarginLineNumbersVisibleWhiteSpaceBookmarkBraceMatching(Highlight)BraceMatching(Rectangle)Breakpoint(Disabled)Breakpoint(Enabled)Breakpoint(Error) ? tnifitcurrentlyisnotelevated(IsUserlnAdmiTryDimflnAdminGroupAsBoolean=Me.IsUserlnAdminGroupMe.IblnAdminGroup.Text=flnAdminGroup.ToString/田任中CatchexAsException 2.3庫的便用Me.IblnAdminGroup.Text=WN/A"MessageBox.Show(ex.Message,"Anerroroccur囲L定不要引用海山魁的陣,且括不必要的頭文MessageBoxButtons.OK,MessageBoxIcon.Error)EMTry 件,或引用不必要的程序集。注重細(xì)節(jié)能夠減少2.4全局變量団2.4全局變量団一定請(qǐng)盡量少用全局變量。為了正確的使用全局變量,一般是將它們作為參數(shù)傳入函數(shù)。永遠(yuǎn)不要在函數(shù)或類內(nèi)部直接引用全局變量,因?yàn)檫@會(huì)引起一個(gè)副作用:在調(diào)用者不知情的情況ド改變了全局變量的狀態(tài)。這對(duì)于靜態(tài)變量同樣適用。如果您需要修改全局變量,您應(yīng)該將其作為ー個(gè)輸出參數(shù),或返回其ー份全局變量的拷貝。0一定請(qǐng)?jiān)谀拇a編輯器中使用定寬字體,例如CourierNew。項(xiàng)目生成時(shí)間,最小化出錯(cuò)幾率,并給讀者ー個(gè)良好的印象。
變量的聲明和初始化団一定請(qǐng)?jiān)谧钚〉?包含該局部變量的作用域塊內(nèi)聲明它。一般,如果語言允許,就僅在使用前聲明它們,否則就在作用域塊的頂端聲明。0一定請(qǐng)?jiān)诼暶髯兞繒r(shí)初始化它們。團(tuán)一定請(qǐng)?jiān)谡Z言允許的情況ド,將局部變量的聲明和初始化或賦值置于同一行代碼內(nèi)。這減少了代碼的垂直空間,確保了變量不會(huì)處在未初始化的狀態(tài)。//C++sample:HANDLEhToken=NULL;PSIDplntegritySid=NULL;STARTUPINFOsi={sizeof(si)};PROCESS_INFORMATIONpi={0};//C#sample:stringname=myObject.Name;intval=time.Hours;'VB.NETsample:DimnameAsString=myObject.NameDimvalAsInteger=time.Hours図一定不要在同一行中聲明多個(gè)變量。推薦每行只包含一句聲明,這樣有利于添加注釋,也減少岐義。例如VisualC++示例,Good:CodeExample*pFirst=NULL;//Pointerofthefirstelement.CodeExample*pSecond=NULL;//Pointerofthesecondelement.Bad:CodeExample*pFirst,*pSecond;后一個(gè)代碼示例經(jīng)常被誤寫為:CodeExample*pFirst,pSecond;這種誤寫實(shí)際上等同于:CodeExample*pFirst;CodeExamplepSecond;函數(shù)的聲明和調(diào)用函數(shù)或方法的名稱,返回值,參數(shù)列表可以有多種形式。原則上應(yīng)該都將這些置于同一行代碼內(nèi)。如果帶有過多參數(shù)不能置于一行代碼,可以進(jìn)行換行:多個(gè)參數(shù)一行或者ー個(gè)參數(shù)一行。將返回值置于函數(shù)或方法名稱的同一行。例如,單行格式://C++functiondeclarationsample:HRESULTDoSomeFunctionCall(intparamlintparam2,int*param3);〃C++/C#functioncallsample:hr=DoSomeFunctionCall(paraml,param2,param3);'VB.NETfunctioncallsample:hr=DoSomeFunctionCall(paraml,param2,param3)多行格式://C++functiondeclarationsample:HRESULTDoSomeFunctionCall(intparamlintparam2,int*param3,intparam4,intparam5);//C++/C#functioncallsample:hr=DoSomeFunctionCall(paraml,param2,param3,param4,param5);'VB.NETfunctioncallsample:hr=DoSomeFunctionCall(paraml,param2,param3,_param4,param5)將參數(shù)列表置于多行代碼時(shí),每ー個(gè)參數(shù)應(yīng)該整齊排列于前ー個(gè)參數(shù)的下方。第一個(gè)類型/參數(shù)對(duì)置于新行行首,并縮進(jìn)ー個(gè)制表符寬度。函數(shù)或方法調(diào)用時(shí)的參數(shù)列表同樣需按照這?格式。//C++sample:HRESULTDoSomeFunctionCall(HWNDhwnd,//Youcancommentparameters,tooT1paraml,//IndicatessomethingT2param2,//IndicatessomethingelseT3param3,//IndicatesmoreT4param4,//IndicatesevenmoreT5param5); //Yougettheidea//C++/C#sample:hr=DoSomeFunctionCall(hwnd,paraml,param2,param3,param4,param5);'VB.NETsample:hr=DoSomeFunctionCall(_hwnd,_paraml,_param2,_param3,_param4,_param5)図一定請(qǐng)將參數(shù)排序,并首先將輸入?yún)?shù)分組,再將輸出參數(shù)放置最后。在參數(shù)組內(nèi),按照能夠幫助程序員輸入正確值的原則來將參數(shù)排序。比如,如果ー個(gè)函數(shù)帶有2個(gè)參數(shù),"left"和"right"?將"left"置于"right"之前,則它們的放置順序符合其參數(shù)名。當(dāng)設(shè)計(jì)ー系列具有相同參數(shù)的函數(shù)時(shí),在各函數(shù)內(nèi)使用一致的順序。比如,如果ー個(gè)函數(shù)帶有一個(gè)輸入類型為句柄的參數(shù)作為第一參數(shù),那么所有相關(guān)函數(shù)都應(yīng)該將該輸入句柄作為第一參數(shù)。代碼語句図一定不要在同一行內(nèi)放置一句以上的代碼語句。這會(huì)使得調(diào)試器的單步調(diào)試變得更為困難。Good://C++/C#sample:a=1;b=2;*VB.NETsample:If(IsAdministrator())ThenConsole.WriteLine("YES”)EndIfBad://C++/C#sample:a=1;b=2;*VB.NETsample:If(IsAdministrator())ThenConsole.WriteLine("YES")
2.8枚舉団一定請(qǐng)將代表某些值集合的強(qiáng)類型參數(shù),屬性和返回值聲明為枚舉類型。0一定請(qǐng)?jiān)诤线m的情況下盡量使用枚舉類型,而不是靜態(tài)常量或"#define"值。枚舉類型是一個(gè)具有一個(gè)靜態(tài)常量集合的結(jié)構(gòu)體。如果遵守這些規(guī)范,定義枚舉類型,而不是帶有靜態(tài)常量的結(jié)構(gòu)體,您便會(huì)得到額外的編譯器和反射支持。Good://C++sample:enumColor(Red,Green,Blue};//C#sample:publicenumColor(Red,Green,Blue}'VB.NETsample:PublicEnumColorRedGreenBlueEndEnumBad://C++sample:TOC\o"1-5"\h\zconst int RED = 0;const int GREEN = 1;const int BLUE = 2;#define RED 0#define GREEN 1#define BLUE 2//C#sample:publicconstpublicconstpublicconstpublicstaticclassColorintRed=0;publicconstpublicconstpublicconstintGreen=1;intBlue=2;VB.NETsample:PublicClassColorPublicConstRedAsInteger=0PublicConstGreenAsInteger=1PublicConstBlueAsInteger=2EndClass図一定不要使用公開集合作為枚舉(例如操作系統(tǒng)版本,您親朋的姓名)。図ー定請(qǐng)為簡單枚舉提供ー個(gè)。值枚舉量,可以考慮將之命名為"None"。如果這個(gè)名稱對(duì)于特定的枚舉并不合適,可以自行定義為更準(zhǔn)確的名稱。//C++sample:enumCompression{None=0,GZip,Deflate);//C#sample:publicenumCompression{None=0,GZip,Deflate)'VB.NETsample:PublicEnumCompressionNone=0GZipDeflateEndEnum図一定不要在.NET中使用Enum.lsDefined來檢查枚舉范圍。Enum.lsDefined有2個(gè)問題。首先,它加載反射和大量類型元數(shù)據(jù),代價(jià)極其昂貴。第二,它存在版本的問題。Good://C#sample:if(c>Color.Black||c<Color.White)(thrownewArgumentOutOfRangeException(...);}VB.NETsample:If(c>Color.BlackOrc<Color.White)ThenThrowNewArgumentOutOfRangeException(...);EndIfBad://C#sample:if(!Enum.IsDefined(typeof(Color),c))(thrownewInvalidEnumArgumentException(...);)'VB.NETsample:IfNot[Enum].IsDefined(GetType(Color),c)ThenThrowNewArgumentOutOfRangeException(...);EndIf標(biāo)志枚舉標(biāo)志枚舉用于對(duì)枚舉值進(jìn)行位運(yùn)算的支持。標(biāo)志枚舉通常用于表示選項(xiàng)。0一定要將System.FlagsAttribute應(yīng)用于標(biāo)志枚舉。一定不要將此屬性用于簡單枚舉。0一定請(qǐng)利用2進(jìn)制強(qiáng)大的能力,因?yàn)樗梢宰杂傻倪M(jìn)行位異或運(yùn)算。舉例,//C++sample:enumAttributeTargets{Assembly=0x0001,Class=0x0002,Struct=0x0004);//C#sample:[Flags]publicenumAttributeTargets{Assembly=0x0001,Class=0x0002,Struct=0x0004,)'VB.NETsample:<Flags()>_PublicEnumAttributeTargetsAssembly=&H1Class=&H2Struct=&H4
EndEnum回您應(yīng)該提供?些特殊的枚舉值,以便進(jìn)行常見的標(biāo)志枚舉的組合運(yùn)算。位運(yùn)算屬于高級(jí)任務(wù),所以在簡單任務(wù)中無需使用它們。FileAccess.ReadWrite便是標(biāo)志枚舉特殊值的ー個(gè)示例。然而,如果ー個(gè)標(biāo)志枚舉中的某些值組合起來是非法的,您就不應(yīng)該創(chuàng)建這樣的標(biāo)志枚舉。//C++sample:enumFileAccess(Read=0x1,Write=0x2,ReadWrite=Read|Write};//C#sample:[Flags]publicenumFileAccess(Read=0x1,Write=0x2,ReadWrite=Read|Write}'VB.NETsample:<Flags()>_PublicEnumFileAccessRead=&H1Write=&H2ReadWrite=ReadOrWriteEndEnum檢查某ー標(biāo)志是否被設(shè)置了的實(shí)現(xiàn)(查看如下if-語句)。該檢查運(yùn)行結(jié)果正確,但是有一處例外,便是對(duì)于〇值的檢查,它的布爾表達(dá)式結(jié)果恒為true。Bad:[Flags]publicenumSomeFlag(ValueA=0, // This mightbeconfusingtousersValueB=1,ValueC=2,ValueBAndC=ValueB|ValueC,)SomeFlagflags=GetValue();if((flags&SomeFlag.ValueA)==SomeFlag.ValueA){)Good:[Flags]publicenumBorderstyle{TOC\o"1-5"\h\zFixed3D = 0x1,FixedSingle = 0x2,None = 0x0図您不應(yīng)該在標(biāo)志枚舉中使用〇值,除非它代表
“所有標(biāo)志被清除了”,并被恰當(dāng)?shù)拿麨轭愃?/p>
“None”的名字。如下図您不應(yīng)該在標(biāo)志枚舉中使用〇值,除非它代表
“所有標(biāo)志被清除了”,并被恰當(dāng)?shù)拿麨轭愃?/p>
“None”的名字。如下C#示例展示了一常見的空格空行図您應(yīng)該使用空行來分隔相關(guān)語句塊。省略額外的空行會(huì)加大代碼閱讀難度。比如,您可以在變量聲明和代碼之間有一行空行。Good://C++sample:voidProcessitem(constItemsitem)(intcounter=0;if(...)()}Bad://C++sample:voidProcessitem(constItemsitem)(intcounter=0;//Implementationstartshere//if(…){))在本例中,過多的空行造成了空行濫用,并不能使代碼更易于閱讀。0您應(yīng)該使用2行空行來分隔方法實(shí)現(xiàn)或類型聲明。空格空格通過降低代碼密度以增加可讀性。以下是使用空格符的一些指導(dǎo)規(guī)范:0您應(yīng)該像如下般在一行代碼中使用空格。Good://C++/C#sample:CreateFoo(); //NospacebetweenfunctionnameandparenthesisMethod(myChar,0,1); //Singlespaceafteracommax=array[index]; //Nospacesinsidebracketswhile(x==y) //Singlespacebeforeflowcontrolstatementsif(x==y) //Singlespaceseparatesoperators*VB.NETsample:CreateFoo() *NospacebetweenfunctionnameandparenthesisMethod(myChar,0,1) *Singlespaceafteracommax=array(index) 1NospacesinsidebracketsWhile(x=y) 'SinglespacebeforeflowcontrolstatementsIf(x=y)Then *SinglespaceseparatesoperatorsBad://C++/C#sample:CreateFoo(); //SpacebetweenfunctionnameandparenthesisMethod(myChar,0,1); //NospacesaftercommasCreateFoo(myChar,〇,1);//Spacebeforefirstarg,afterlastargx=array[index]; //SpacesinsidebracketsTOC\o"1-5"\h\zwhile(x==y) //Nospacebeforeflowcontrolstatementsif(x==y) //Nospaceseparatesoperators'VB.NETsample:CreateFoo() *SpacebetweenfunctionnameandparenthesisMethod(myChar,0,1) 'NospacesaftercommasCreateFoo(myChar,0,1) 'Spacebeforefirstarg,afterlastargx=array(index) *SpacesinsidebracketsWhile(x=y) 'NospacebeforeflowcontrolstatementsIf(x=y)Then *Nospaceseparatesoperators大括號(hào)El一定請(qǐng)?jiān)讴`站式示例代碼庫的代碼示例中使用Allman風(fēng)格的大括號(hào)用法。Allman風(fēng)格是以EricAllman命名的,有時(shí)也被稱為"ANSI風(fēng)格"。該風(fēng)格將大括號(hào)與相關(guān)代碼置于下一行內(nèi),與控制語句的縮進(jìn)相同。大括號(hào)內(nèi)的語句縮進(jìn)一個(gè)等級(jí)。Good://C++/C#sample:if(x>5)(y=o;VB.NETsample:If(x>5)Theny=0EndIfBad(inAll-In-OneCodeFrameworksamples)://C++/C#sample:if(x>5){y=0;)0您應(yīng)該在即使是單行條件式的情況下也使用大括號(hào)。這樣做使得將來增加條件式更簡便,并減少制表符引起的歧義。Good://C++/C#sample:if(x>5)(y=o;)VB.NETsample:If(x>5)Theny=0EndIfBad://C++/C#sample:if(x>5)y=0;'VB.NETsample:If(x>5)Theny=0注釋0您應(yīng)該使用注釋來解釋一段代碼的設(shè)計(jì)意圖。一定不要讓注釋僅僅是重復(fù)代碼。
Good://DeterminewhethersystemisrunningWindowsVistaorlateroperating//systems(majorversion>=6)becausetheysupportlinkedtokens,but//previousversions(majorversion<6)donot.Bad://Thefollowingcodesetsthevariableitothestartingvalueofthe//array.Thenitloopsthrougheachiteminthearray.図您應(yīng)該使用‘〃‘注釋方式,而不是'/**/’來為C++和C#代碼作注釋。即使注釋跨越多行代碼,單行注釋語法(//...)仍然是首選。//DeterminewhethersystemisrunningWindowsVistaorlateroperating//systems(majorversion>=6)becausetheysupportlinkedtokens,but//previousversions(majorversion<6)donot.if(Environment.OSVersion.Version.Major>=6)'Getanddisplaytheprocesselevationinformation(IsProcessElevated)'andintegritylevel(GetProcessIntegrityLevel).Theinformationisnot'availableonoperatingsystemspriortoWindowsVista.If(Environment.OSVersion.Version.Major>=6)ThenEndIfE您應(yīng)該將注釋縮進(jìn)為被其描述的代碼的同一級(jí)。0您應(yīng)該在注釋屮使用首字母大寫的完整的句子,以及適當(dāng)?shù)臉?biāo)點(diǎn)符號(hào)和拼寫。Good://IntializethecomponentsontheWindowsForm.InitializeComponent();'IntializethecomponentsontheWindowsForm.InitializeComponent()Bad://intializethecomponentsontheWindowsForm.InitializeComponent();,intializethecomponentsontheWindowsFormInitializeComponent()內(nèi)聯(lián)代碼注釋if(MAXVAL>=exampleLength)內(nèi)聯(lián)注釋應(yīng)該置于獨(dú)立行,并與所描述的代碼具有相同的縮進(jìn)。其之前需放置ー個(gè)空行。其之后不需要空行。描述代碼塊的注釋應(yīng)該置于獨(dú)立行,與if(MAXVAL>=exampleLength)//Reprorttheerror.ReportError(GetLastError());//Thevalueisoutofrange,wecannotcontinue.returnE_INVALIDARG;)當(dāng)內(nèi)聯(lián)注釋只為結(jié)構(gòu)體,類成員變量,參數(shù)和短語句做描述時(shí),則內(nèi)聯(lián)注釋允許出現(xiàn)在和實(shí)際代碼的同一行。在本例中,最好將所有變量的注釋對(duì)齊。classExample(public:voidTestFunction(do)while(!fFinished);//Continueifnotfinished.)private:intm_length;//Thelengthoftheexamplefloatm_accuracy;//Theaccuracyoftheexample};図您不應(yīng)該在代碼中留有過多注釋。如果每一行代碼都有注釋,便會(huì)影響到可讀性和可理解性。單行注釋應(yīng)該用于代碼的行為并不是那么明顯易懂的情況。如下代碼包含多余注釋:Bad://Loopthrougheachiteminthewrinklesarrayfor(inti=0;i<=nLastWrinkle;i++){Wrinkle*pWrinkle=apWrinkles[i];//Getthenextwrinkleif(pWrinkle->IsNew()&&//Processifit'sanewwrinklenMaxImpact<pWrinkle->GetImpact())//Andithasthebiggestimpact(nMaxImpact=pWrinkle->GetImpact();//SaveitsimpactforcomparisonpBestWrinkle=pWrinkle;//Rememberthiswrinkleaswell))更好的實(shí)現(xiàn)如ド:Good://Loopthrougheachiteminthewrinklesarray,findtheWrinklewith//thelargestimpactthatisnew,andstoreitin'pBestWrinkle'.for(inti=0;i<=nLastWrinkle;i++){Wrinkle*pWrinkle=apWrinkles[i];if(pWrinkle->IsNew()&&nMaxImpact<pWrinkle->GetImpact())(nMaxImpact=pWrinkle->GetImpact();pBestWrinkle=pWrinkle;? Modu1q)}Header*ModuleName:<FileName>必您應(yīng)該為那些僅通過閱讀很難理解其意圖的代碼,Project: <SampleName>,Copyright(c)Microsoft添加注釋。Corporation.T,<Descriptionofthefile>2.11.2文件頭注釋*ThissourceissubjecttotheMicrosoftPublicLicense.0一定請(qǐng)為每一份手寫代碼文件加入文件頭注*See/opensource/li釋。如下為文件頭注釋:censes.mspx#Ms-PL.,Allotherrightsreserved.VC++和VC#文件頭注釋模板:'THISCODEANDINFORMATIONISPROVIDED"ASIS"WITHOUTWARRANTYOF/★★***★****★*★***********★★****Modu1eANYKIND,Header******************************\'EITHEREXPRESSEDORIMPLIED,ModuleName:<FileName>INCLUDINGBUTNOTLIMITEDTOTHEProject: <SampleName>Copyright(c)MicrosoftCorporation.IMPLIED,WARRANTIESOFMERCHANTABILITYAND/ORFITNESSFORAPARTICULARPURPOSE.<Descriptionofthefile>★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ThissourceissubjecttotheMicrosoftPublicLicense.See舉例,/opensource/licenses.mspx#Ms-PL.Allotherrightsreserved./******************************Modu]eHeader******************************\THISCODEANDINFORMATIONISPROVIDEDModuleName:CppUACSelfElevation.cpp"ASISMWITHOUTWARRANTYOFANYKIND,Project: CppUACSelfElevationEITHEREXPRESSEDORIMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEIMPLIEDCopyright(c)MicrosoftCorporation.WARRANTIESOFMERCHANTABILITYAND/ORUserAccountControl(UAC)isanewFITNESSFORAPARTICULARPURPOSE.securitycomponentinWindowsVistaヽ*************************************and**************************************neweroperatingsystems.WithUAC/fullyenabled,interactiveadministratorsnormallyrunwithleastuserVB.NET文件頭注釋模板:privileges.Thisexampledemonstrateshowtochecktheprivilegelevelofthecurrentprocess,andhowtoselfelevatetheprocessbygivingexplicitconsentwiththeConsentUI.ThissourceissubjecttotheMicrosoftPublicLicense.See/opensource/licenses.mspx#Ms-PL.Allotherrightsreserved.THISCODEANDINFORMATIONISPROVIDEDMASISMWITHOUTWARRANTYOFANYKIND,EITHEREXPRESSEDORIMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEIMPLIEDWARRANTIESOFMERCHANTABILITYAND/ORFITNESSFORAPARTICULARPURPOSE.ヽ*************************************★★★★★★*★★***********★★*************★*★/2.11.3類注釋0您應(yīng)該為每ー個(gè)重要的類或結(jié)構(gòu)體作注釋。注釋的詳細(xì)程度應(yīng)該視代碼的用戶群而定。C++類注釋模板://NAME:class<Classname>//DESCRIPTION:<Classdescription>//C#和VB.NET使用.NET描述性XML文檔化注釋。當(dāng)您編譯.NET項(xiàng)目,并帶有/doc命令時(shí),編譯器會(huì)在源代碼中搜索XML標(biāo)簽,并生成XML文檔。C#類注釋模板:
///<summary>III<Classdescription>III</summary>VB.NET類注釋模板:**<summary>'*'<Classdescription>**</summary>舉例,////NAME:classCodeExample//DESCRIPTION:TheCodeExampleclassrepresentsanexampleofcode,and//tracksthelengthandcomplexityoftheexample.//classCodeExample();III<summary>IIITheCodeExampleclassrepresentsanexampleofcode,andtracksIIIthelengthandcomplexityoftheexample,III</summary>publicclassCodeExample{)2.11.4函數(shù)注釋E您應(yīng)該為所有重要的Public或非Public函數(shù)作注釋。注釋的詳細(xì)程度應(yīng)該視代碼的用戶群而定。
C++函數(shù)注釋模板:/* FUNCTION:<Funtionprototype〉PURPOSE:<Functiondescription>PARAMETERS:<Parametername>ーくParameterdescription>RETURNVALUE:<Descriptionoffunctionreturnvalue>EXCEPTION:<Exceptionthatmaybethrownbythefunction>EXAMPLECALL:<Examplecallofthefunction>REMARKS:<Additionalremarksofthefunction>C#和VB.NET使用.NET描述性XML文檔化注釋。在一般情況下,至少需要一個(gè)〈summary〉元素,,個(gè)(parameters)兀素和〈returns〉元素。會(huì)拋出異常的方法應(yīng)使用〈exception〉元素來告知使用者哪些異常會(huì)被拋出。///<summary>III<Functiondescription>II!〈/summary〉III<paramname=MParametername**>III<Parameterdescription>III</param>III<returns>III<Descriptionoffunctionreturnvalue>III</returns>III<exceptioncref="<Exceptiontype>">III<Exceptionthatmaybethrownbythefunction>III</exception>VB.NET函數(shù)注釋模板:一’<summary>***<Functiondescription>111</summary>''<paramname=MParametername">**<Parameterdescription>1*</param>*'<returns>1*'<Descriptionoffunctionreturnvalue>'J</returns>**<exceptioncref="<Exceptiontype〉”)''<Exceptionthatmaybethrownbythefunction>**</exception>舉例,/* C#函數(shù)注釋模板:C#函數(shù)注釋模板:ThefunctioncheckswhethertheprimaryaccesstokenoftheprocessbelongstouseraccountthatisamemberofthelocalAdministratorsgroup,evenifitcurrentlyisnotelevated?PARAMETERS:hToken-thehandletoanaccesstoken.RETURNVALUE:ReturnsTRUEiftheprimaryaccesstokenoftheprocessbelongstouseraccountthatisamemberofthelocalAdministratorsgroup.ReturnsFALSEifthetokendoesnot.EXCEPTION:Ifthisfunctionfails,itthrowsaC++DWORDexceptionwhichcontainstheWin32errorcodeofthefailure?EXAMPLECALL:tryif(IsUserlnAdminGroup(hToken))wprintf(L"UserisamemberoftheAdministratorsgroup'n");elsewprintf(L"UserisnotamemberoftheAdministratorsgroup\nM);)catch(DWORDdwError)(wprintf(L"IsUserlnAdminGroupfailedw/err%lu\nM,dwError);)III<summary>IIIThefunctioncheckswhethertheprimaryaccesstokenoftheprocessIIIbelongstouseraccountthatisamemberofthelocalAdministratorsIIIgroup,evenifitcurrentlyisnotelevated.Ill</summary>III<paramname=ntoken">Thehandletoanaccesstoken</param>III<returns>IIIReturnstrueiftheprimaryaccesstokenoftheprocessbelongstoIIIuseraccountthatisamemberofthelocalAdministratorsgroup.IllReturnsfalseifthetokendoesnot.Ill</returns>III<exceptioncref=wSystem.ComponentModel.Win32Exception">IIIWhenanynativeWindowsAPIcallfails,thefunctionthrowsaIIIWin32Exceptionwiththelasterrorcode.Ill</exception>任何調(diào)用失敗會(huì)帶來副作用的方法或函數(shù),都需要清楚地在注釋中交代那些副作用的后果。一般而言,代碼在發(fā)生錯(cuò)誤或失敗時(shí)不應(yīng)該有副作用。當(dāng)出現(xiàn)副作用時(shí),在編寫代碼時(shí)應(yīng)該有清楚的理由。當(dāng)函數(shù)沒有輸出參數(shù),或者只有一些單純作為輸出參數(shù)的情況下,無需交代理由。2.11.5將代碼注釋掉當(dāng)您用多種方法實(shí)現(xiàn)某些任務(wù)時(shí),將代碼注釋掉便是必須的。除了第一個(gè)方法,其余實(shí)現(xiàn)方法都會(huì)被注釋掉。使用卜。H來分隔多個(gè)方法。舉例,//C++/C#sample://Demothefirstsolution.DemoSolutionl();//[-or-]//Demothesecondsolution.//DemoSolution2();'VB.NETsample:'Demothefirstsolution.DemoSolutionl();'[-or-]'Demothesecondsolution.,DemoSolution2();2.11.6TODO待辦注釋?一定不要在已發(fā)布的代碼示例中使用TODO待辦注釋。每ー個(gè)代碼示例都必須完整,在代碼中不能有未完成的任務(wù)。2.12代碼塊0一定請(qǐng)?jiān)诖罅看a會(huì)因?yàn)楦呓Y(jié)構(gòu)化而獲益時(shí),使用代碼塊聲明。通過作用域或者功能性分類,將大量代碼分組,會(huì)改善代碼易讀性和結(jié)構(gòu)。C++代碼塊:#pragmaregion"HelperFunctionsforXXW#pragmaendregionC#代碼塊:#regionHelperFunctionsforXX#endregionVB.NET代碼塊:#Region"HelperFunctionsforXXM#EndRegionCppWindowsServicePropertyPages▼Platform:Active(Win32)▼Platform:Active(Win32)Create/UsePrecompiledHeaderCreate/UsePCHThroughFilePrecompiledHeaderFileCreate/UsePrecompiledHeaderEnablescreationoruseofaprecompiledhe3C++編程規(guī)范以ド編程規(guī)范適用于本地C++代碼。編譯器選項(xiàng)預(yù)編譯頭図一定不要使用預(yù)編譯頭。VisualC++項(xiàng)目默認(rèn)使用預(yù)編譯頭文件。其原理是當(dāng)生成stdafx.h/cpp文件時(shí),巨大的Windows頭文件只被編譯一次。項(xiàng)目中其他任何ー個(gè),CPP文件都需要首先包含include"stdafx.h"i這樣項(xiàng)目オ能正確生成。當(dāng)編譯器找到"stdafx.h"時(shí),便知道何時(shí)插入預(yù)編譯頭信息。在代碼示例中,必須關(guān)閉預(yù)編譯頭選項(xiàng)。在您的項(xiàng)目屬性中,找到C/C++標(biāo)簽頁,選擇Precompiledheaders節(jié)點(diǎn)。點(diǎn)擊Notusingprecompiledheaders單選按鈕,之后點(diǎn)擊OK。請(qǐng)確保修改了所有的配置(包括Debug配置和Release配置)。之后,移除所有源文件的#include<stdafx.h>〇Configuration:|AllConfigurationsCommonProperties *ConfigurationPropertiesGeneralDebugging,C/C++GeneralOptimizationPreprocessorCodeGenerationLanguage ;PrecompiledHeadersOutputFilesBrowseInformationAdvancedCommandLineLinkerManifestToolXMLDocumentGeneratort>BrowseInformationBuildEventsCustomBuildStep「 川 ’開啟所有警告,并當(dāng)做錯(cuò)誤來對(duì)待0您應(yīng)該以最高警告等級(jí)來編譯所有代碼。0您應(yīng)該把警告當(dāng)做錯(cuò)誤來對(duì)待。編譯器提示的警告通常對(duì)于鑒別低劣的代碼和隱晦的bug非常有用。您可以以編譯器警告對(duì)您的代碼進(jìn)行額外的驗(yàn)證。在VisualStudio中,您可以在項(xiàng)目的屬性設(shè)置頁面開啟警告等級(jí)4。在項(xiàng)目屬性設(shè)置頁面,找到
"ConfigurationProperties","C/C++","General",將"WarningLevel"設(shè)置為"Level4"〇文件和結(jié)構(gòu)stdafx.h,stdafx.cpp,targetver.h0您應(yīng)該刪除VisualStudio項(xiàng)目模板生成的stdafx.h,stdafx.cpp和targetver.h文件以保持示例的簡潔。然而,如果您有許多被大量代碼文件共享的標(biāo)準(zhǔn)頭文件,您可以創(chuàng)建單獨(dú)的文件來包含它們。這非常類似于Windows.h的作用。頭文件團(tuán)一定請(qǐng)?jiān)陬^文件內(nèi)使用包含保護(hù)符(includeguards)?來防止頭文件被無意的多次包含。以下示例代碼中的#ifndef和?tendif,應(yīng)該為頭文件的第一行和最后一行代碼。示例代碼展示了如何在"CodeExample.h"屮使用"#ifndef/#endiF’作為包含保護(hù)符。//Fileheadercommentgoesfirst...#ifndefCODE_EXAMPLE_H_#defineCODE_EXAMPLE_H_classCodeExample(};#endif您也可以使用^pragmaonce"(微軟編譯器的ー個(gè)特定拓展)來替代〃#ifndef/#endiア包含保護(hù)符://Fileheadercommentgoesfirst...#pragmaonceclassCodeExample{);図您不應(yīng)該在頭文件內(nèi)實(shí)現(xiàn)函數(shù)。頭文件只能包含函數(shù)聲明和數(shù)據(jù)結(jié)構(gòu)。它們的實(shí)現(xiàn)應(yīng)置于.cpp文件。實(shí)現(xiàn)文件實(shí)現(xiàn)文件包含了全局函數(shù),局部函數(shù)和類方法實(shí)際的函數(shù)體。實(shí)現(xiàn)文件是拓展名為.C或者.cpp的文件。注意,實(shí)現(xiàn)文件不必包含整個(gè)模塊的完整實(shí)現(xiàn)。它可以被分隔,并包含一個(gè)公共內(nèi)部接口。回您應(yīng)該將不必導(dǎo)出的聲明放置在實(shí)現(xiàn)文件中。此外,您應(yīng)該為它們加上static關(guān)鍵字,以限制其作用域在該.cpp/.c文件定義的編譯單元。這將減少當(dāng)鏈接2個(gè)或更多使用了相同內(nèi)部變量的.cpp
文件時(shí),出現(xiàn)"multiply?definedsymbol”錯(cuò)誤的情函數(shù),方法Pascal規(guī)范文件時(shí),出現(xiàn)"multiply?definedsymbol”錯(cuò)誤的情函數(shù),方法Pascal規(guī)范名詞或或動(dòng)名詞voidPrvoidPr況。接口PascalC規(guī)范,帶‘I’前綴名字interfa3.3命名規(guī)范結(jié)構(gòu)體所有字母大寫,以分隔單詞名詞struct宏,常量所有字母大寫,以二分隔單詞#define#define3.3.1通用命名規(guī)范#defineconsti回一定請(qǐng)為各種類型,函數(shù),變量,特性和數(shù)據(jù)參數(shù),變量Camel規(guī)范名詞example模板參數(shù)Pasca!規(guī)范,帶名詞T,TIte結(jié)構(gòu)選取有意義的命名。其命名應(yīng)能反映其作T前綴3.3.3匈牙利命名法図您不應(yīng)該在標(biāo)識(shí)符名屮使用縮短或縮略形式的詞。比如,使用“GetWindow"而不是"GetWin”。對(duì)于公共類型,線程過程,窗口過程,和對(duì)話框向您可以對(duì)參數(shù)和變量使用匈牙利命名法。然而,匈牙利命名法相當(dāng)老舊,會(huì)對(duì)代碼重構(gòu)造成困難。例如,當(dāng)改變變量類型時(shí),您需要對(duì)所有代碼都進(jìn)行更改。如下表格定義了一套配套的匈牙利命名法標(biāo)記,如果您使用匈牙利命名法,建議使用它們。過程函數(shù),為"ThreadProc","DialogProc”,“WndProc”等使用公共后綴。I類型I標(biāo)記(描述bool,BOOL,bitfieldf個(gè)旗標(biāo)。例如,BOOLfSucceeded3.3.2標(biāo)識(shí)符的大小寫命名規(guī)范BYTE一ー個(gè)8位無符號(hào)數(shù)。BYTE應(yīng)當(dāng)僅用于?不iWORDー個(gè)16位無符號(hào)數(shù)。WORD應(yīng)當(dāng)僅用于DWORDdw,個(gè)32位無符號(hào)數(shù)。DWORD應(yīng)當(dāng)僅用」如ド表格描述了對(duì)不同類型標(biāo)識(shí)符的大小寫命名HRESULThrHRESULT一般用于Win32的錯(cuò)誤或規(guī)范。VARIANTvtー個(gè)OLEVARIANT.HANDLEhー個(gè)句柄int—/?個(gè)32位序數(shù)(可以用于<<=>,>=等ヒ標(biāo)識(shí)符I大小寫命名規(guī)范命名結(jié)構(gòu)示例nsignedint/位?類Pascal規(guī)范名詞classComplexNumber{classcodeExample{.,cl閉"igRQ<!自{.../?個(gè)16位序數(shù)。盡量不f使用這些標(biāo)志枚舉Pascal規(guī)范名字entong/Pe<???);ー個(gè)32位序數(shù)。盡量不要使用這些標(biāo)志
unsignedlongJ3.3.4用戶界面特件布タ攧前_int64,LONGLONG,ULONGLONG/ー個(gè)64位序數(shù)。用戶蛻向控件可仲用如下前統(tǒng)?以乃能后的咨頫TCHAR,wchar_t,charchー個(gè)字符(未指明符號(hào))。"w和TCHARS,我們使用相同的標(biāo)和WCHAR的特例,則使用"ch,ch土件"ービ類型更適合于寬字符,因?yàn)槠鋵儆贑++內(nèi)置類型。對(duì)于char檄讓盤蟠隣噸到W讐charPWSTR,PCWSTR,wchar__t*,PSTR,PCSTR,char*pszー個(gè)指向。值結(jié)F不同標(biāo)志,對(duì)于(psz”代表PSTR凡和PSTR。所有指g的字符串。因?yàn)槲覀冊陧?xiàng)目中都使用Unicode,我們不必為PSTR和PWSTR設(shè)置har和TCHARJ"pwsz"代表針都是長指針控件類型控件句柄命名格式!控件命名猊wchar_t口,char[]sz,個(gè)。俏結(jié)尾的字符小(形式為細(xì)濟(jì)朋P露1?trqし如.wcharpXxxAnimateaniXxxszMessage[BUFFER_SIZE]PuttonhXxxButtonbtnXxxBSTRbstrー個(gè)OLEn動(dòng)化的BSTR.CheckBoxhXxxCheckcikXxxvoidー個(gè)voidn對(duì)于指向void的指針C6徜bb'Bb前綴hXxxCombocmbXxx(?)()ー個(gè)函數(shù)。對(duì)于指向函數(shù)的指針,D設(shè)煙口Hid怖ckerhXxxDatePickerdtpXxxEditControlhXxxEdittbXxx舉例,GroupBoxhXxxGroupgrpXxxHANDLEhMapFile=NULL;DWORDdwError=NO_ERROR;HorizontalScrollBarhXxxScrollhsbXxxIPAddressControlhXxxIpAddripXxxListBoxhXxxListIstXxx匈牙利命名法的前綴用于增加類型信息ー以下是匈List(View)ControlhXxxListIvwXxxMenuhXxxMenuN/A牙利命名標(biāo)志的前綴:MonthCalendarControlhXxxCalendarmclXxxPictureBoxhXxxPicturepctXxxPrefix1DescriptionProgressControlhXxxProgressHrgXxxPー個(gè)指針(32位或64位,取決
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦文辦會(huì)辦事管理制度
- 基金公司公司管理制度
- 公司境內(nèi)投資管理制度
- 外包客服店鋪管理制度
- 廣西建工安全管理制度
- 定制校服銷售方案(3篇)
- 初級(jí)工廠車間管理制度
- DB6103T 93-2025 獼猴桃高溫?zé)岷︻A(yù)警等級(jí)劃分規(guī)范
- 水庫參數(shù)復(fù)核方案(3篇)
- 車位成本控制方案(3篇)
- 大型養(yǎng)路機(jī)械綜合講義
- 高分子材料完整版課件
- 2022年商務(wù)標(biāo)技術(shù)標(biāo)最全投標(biāo)文件模板
- TFDS系統(tǒng)介紹(濟(jì)南)
- 滾子鏈鏈輪的基本參數(shù)和主要尺寸
- 青海省基本醫(yī)療保險(xiǎn)門診特殊病慢性病病種待遇認(rèn)定表
- 幼兒園組織構(gòu)架圖-及工作流程
- 維氏硬度計(jì)作業(yè)指導(dǎo)書
- 酒店各部門員工考核標(biāo)準(zhǔn)評(píng)分表
- JJG 162-2019飲用冷水水表 檢定規(guī)程(高清版)
- 輸出軸零件的機(jī)械加工工藝規(guī)程
評(píng)論
0/150
提交評(píng)論