建立標准編碼規則(四)-C#編碼規范分類及實現


1 現實中的問題

在任何一個公司,每個程序員編寫的習慣可能都是不一樣的,大到命名空間,小到變量的名字。甚至,我們去github,里面的大牛每個開源的項目的命名規則可能都不一樣。

我們通常會遇到下面的問題

1 一個webapi,版本1是一種寫法,版本2認知到版本1的寫法過於老舊又換了一種寫法

2 一個webapi,程序員老王習慣返回大寫,程序員小張喜歡返回小寫

3 各個業務類似的webapi,名字都不相同,例如供應商有的用vendor 有的用supplier 有的干脆用拼音

4 公司有實際的編碼規范,但檢測成本太高,久而久之,公司的規范也就作廢了

5 數據庫規范、編碼規范、api規范可能不盡相同,有沖突,制造了轉換成本

這實際上會給我們增加溝通成本,當遇到bug的時候,代價是巨大的。

前段實際阿里發布了java規范,可謂行業標桿,微軟為啥就沒有發布一個可推廣的編碼規范呢。

 

2 編碼規范的目的及基本情況

我認為編碼規范的目的是為了使代碼不依賴與代碼編寫者而存在。就是無限增加代碼的可讀性,易維護性。

我們不光要考慮程序代碼的可讀性還要考慮

1 數據庫的可讀性

2 程序代碼的可讀性

3 對外開放的api可讀性

這三種情況的業務場景對代碼規范又不盡相同。

 數據庫

數據庫因為受限於數據庫軟件,需要強制對數據庫命名進行約束

SQL SERVER數據庫,目前在windows上已知的是沒有什么大小寫限制,在Linux上未知沒有試過

mysql 數據庫,推薦全部小寫,英文之間加下划線_,例如 useraddress 表示為user_address

oracle數據庫,推薦全部大寫,因為之間加下划線_,例如useraddress表示為 USER_ADDRESS

程序編碼

C# 基本上 類名UpperCamelCase,公共方法 UpperCamelCase 私有方法 LowerCamelCase

對外的API

json一般建議是的 小寫,下划線寫法

xml到時沒有什么特定的規范

 

我們這里要討論的是,這三種如何統一,如何轉換的問題

 3 如何保證編碼規范的可執行性

任何脫離可執行的規范文件都是耍流氓

1.數據庫,我們可以編寫程序遍歷數據庫,檢測是否合規

2.代碼,可以使用Roslyn編寫分析器

 

4 C#代碼規范

C#代碼規范可以參考StyleCop做簡單的說明,一共171條規則,新版已經刪除了部分規則並新增了部分規則。一個規則可能有多個代碼分析器,所以實際上是看起來很多而已。

我們可以下載源碼對其進行修改編輯,形成自己公司的代碼規范。

SA1600	ElementsMustBeDocumented	元素必須添加注釋
SA1601	PartialElementsMustBeDocumented	Partial修飾的成員必須添加注釋
SA1602	EnumerationItemsMustBeDocumented	枚舉必須添加注釋
SA1603	DocumentationMustContainValidXml	注釋必須合法(注釋中的關鍵字不能有錯誤)
SA1604	ElementDocumentationMustHaveSummary	元素注釋必須包含Summary關鍵字
SA1605	PartialElementDocumentationMustHaveSummary	Partial修飾的成員注釋必須包含Summary關鍵字
SA1606	ElementDocumentationMustHaveSummaryText	Summary節點內部必須添加文本
SA1607	PartialElementDocumentationMustHaveSummaryText	Partial修飾的成員注釋Summary節點內部必須添加文本
SA1608	ElementDocumentationMustNotHaveDefaultSummary	Summary注釋不能使用編譯器自帶的注釋文本
SA1609	PropertyDocumentationMustHaveValue	屬性的注釋中必須包含<Value>節點
SA1610	PropertyDocumentationMustHaveValueText	屬性的注釋<Value>節點必須包含文本值
SA1611	ElementParametersMustBeDocumented	參數必須注釋
SA1612	ElementParameterDocumentationMustMatchElementParameters	參數的個數必須與注釋里的個數一致
SA1613	ElementParameterDocumentationMustDeclareParameterName	參數的注釋里必須有參數的名稱
SA1614	ElementParameterDocumentationMustHaveText	參數注釋節點里不能空着
SA1615	ElementReturnValueMustBeDocumented	返回值必須添加注釋
SA1616	ElementReturnValueDocumentationMustHaveText	返回值注釋的節點內必須有文本值
SA1617	VoidReturnValueMustNotBeDocumented	空返回值一定不能有返回值注釋
SA1618	GenericTypeParametersMustBeDocumented	生成的類型(泛型)參數必須有注釋
SA1619	GenericTypeParametersMustBeDocumentedPartialClass	SA1618情況如果有Partial類存在都要有注釋
SA1625	ElementDocumentationMustNotBeCopiedAndPasted	各個參數的注解不能完全相同(避免copy
SA1626	SingleLineCommentsMustNotUseDocumentationStyleSlashes	單行注釋不能采取三個斜線的注釋方式,斜線的個數必須是二的倍數
SA1627	DocumentationTextMustNotBeEmpty	注釋節點內部不能為空(必須有文本值)
SA1628	DocumentationTextMustBeginWithACapitalLetter	注釋節點內部的文本必須以大寫字母開頭
SA1629	DocumentationTextMustEndWithAPeriod	注釋節點內部的文本必須英文的句號結束
SA1630	DocumentationTextMustContainWhitespace	注釋節點內部的文本必須包含空格
SA1631	DocumentationMustMeetCharacterPercentage	注釋節點內部的文本中不能包含過多的字符(舉例包含’---------------’是不允許的)
SA1632	DocumentationTextMustMeetMinimumCharacterLength	已經作廢的規則,不允許有太短的字符串(如’Aname’中的A字母)
SA1642	ConstructorSummaryDocumentationMustBeginWithStandardText	構造函數注釋標准
SA1643	DestructorSummaryDocumentationMustBeginWithStandardText	析構函數注釋標准
SA1644	DocumentationHeadersMustNotContainBlankLines	注釋中不能出現空白行
SA1645	IncludedDocumentationFileDoesNotExist	如果注釋中包含文件,要確定這個文件存在,舉例
SA1646	IncludedDocumentationXPathDoesNotExist	如果注釋中包含文件,路徑不存在。
SA1647	IncludeNodeDoesNotContainValidFileAndPath	如果注釋中包含文件文件與路徑都要合法
SA1648	InheritDocMustBeUsedWithInheritingClass	這項不明白是什么意思,還請知道的分享給我,謝謝。
SA1649	FileHeaderFileNameDocumentationMustMatchTypeName	文件頭注釋必須匹配類型
SA1650	ElementDocumentationMustBeSpelledCorrectly	注釋不能有拼寫錯誤(對中文支持不好,不建議使用該項)
SA1651	DoNotUsePlaceholderElements	不要使用Placeholder元素
SA1500	BracesForMultiLineStatementsMustNotShareLine  	當存在多行程序的時候,花括號不能再同一行。
SA1501	StatementMustNotBeOnASingleLine   	語句不能共享一行
SA1502	ElementMustNotBeOnASingleLine   	元素不能共享一行
SA1503	BracesMustNotBeOmitted  	花括弧即使在單行代碼的情況下也不能省略。
SA1504	AllAccessorsMustBeSingleLineOrMultiLine  	讀寫屬性,要么在同一行業要么在分多行寫,不可規則不統一(個人建議分多行寫)。
SA1505	OpeningBracketsMustNotBeFollowedByBlankLine 	開始的花括弧后面不能有空白行
SA1506	ElementDocumentationHeadersMustNotBeFollowedByBlankLine 	元素頭部注釋跟元素之間不能有空白行
SA1507	CodeMustNotContainMultipleBlankLinesInARow 	不允許有多行空白行緊挨着(個人建議寫一個空白行即可)
SA1508	ClosingCurlyBracketsMustNotBePrecededByBlankLine 	結尾的花括弧不能再一個空白行之前
SA1509	OpeningBracketsMustNotBePrecededByBlankLine  	開始的花括弧不能再一個空白行之前
SA1510	ChainedStatementBlocksMustNotBePrecededByBlankLine 	相連的語句之間不能有空白行,如try語句與catch語句之間不能有空白行
SA1511	WhileDoFooterMustNotBePrecededByBlankLine  	與SA1510相同,Do語句與While語句之間不能有空白行
SA1512	SingleLineCommentsMustNotBeFollowedByBlankLine 	單行注釋不能后跟空白行
SA1513	ClosingBracketMustBeFollowedByBlankLine 	結束花括弧之后必須有一個空白行
SA1514	ElementDocumentationHeaderMustBePrecededByBlankLine 	頭部注解之前必須有一個空白行
SA1515	SingleLineCommentMustBePrecededByBlankLine 	單行注釋之前要有一個空白行,還一種方法是不加空白行而用四個斜線注釋”////”建議采取第一種方法
SA1516	ElementsMustBeSeparatedByBlankLine 	鄰近的元素之間要有一個空白行
SA1517	CodeMustNotContainBlankLinesAtStartOfFile 	代碼文件頭部字符之前不能出現空白行
SA1518	CodeMustNotContainBlankLinesAtEndOfFile	代碼文件尾部字符之后不能出現空白行
SA1119	StatementMustNotUseUnnecessaryParenthesis  	語句中不可以出現多余的括弧,無意義的括弧增加了代碼的可讀性
SA1400	AccessModifierMustBeDeclared  	必須定義訪問修飾符
SA1401	FieldsMustBePrivate  	字段必須定義為私有的
SA1402	FileMayOnlyContainASingleClass 	一個CS文件里只定義一個類
SA1403	FileMayOnlyContainASingleNamespace  	一個CS文件只包含一個命名空間
SA1404	CodeAnalysisSuppressionMustHaveJustification   	Suppression特性(取消報告特定的靜態分析工具規則沖突,允許一個代碼項目上應用多個取消報告設置)必須要有合理理由
SA1405	DebugAssertMustProvideMessageText 	 參見代碼:“Debug.Assert(value != true"The value must always be true.");”
SA1406	DebugFailMustProvideMessageText   	參見代碼:“Debug.Fail("The code should never reach this point.");”
SA1407	ArithmeticExpressionsMustDeclarePrecedence 	算數表達式必須用明確的標明其優先級(此條與SA1119沖突)
SA1408	ConditionalExpressionsMustDeclarePrecedence 	條件表達式必須明確的標明其優先級(此條與SA1119沖突) 舉例:“if (x || (y && z && a) || b)”
SA1409	RemoveUnnecessaryCode  	移除無用的代碼
SA1410	RemoveDelegateParenthesisWhenPossible  	調用一個c#匿名方法不包含任何方法參數必須要包括一個空括號(本人不建議使用匿名方法
SA1411	AttributeConstructorMustNotUseUnnecessaryParenthesis 	特性構造函數如果是空參的形式,不要包括那個空括號
SA1412	StoreFilesAsUtf8	文件是否已utf8格式存儲
SA1413	UseTrailingCommasInMultiLineInitializers	初始化對象變量之間使用逗號隔開
SA1300	ElementMustBeginWithUpperCaseLetter  	首字母必須大寫(個人理解應該是字段以外的東西)
SA1301	ElementMustBeginWithLowerCaseLetter  	不會出現的情況
SA1302	InterfaceNamesMustBeginWithI  	接口必須以“I”字母開頭
SA1303	ConstFieldNamesMustBeginWithUpperCaseLetter Const	常量首字母大寫
SA1304	NonPrivateReadonlyFieldsMustBeginWithUpperCaseLetter 	非私有非制度的字段必須首字母大寫
SA1305	FieldNamesMustNotUseHungarianNotation 	除了列表外的字符不可以出現匈牙利命名規則在”Style Setting”里的” Hungarian”Tab里設置
SA1306	FieldNamesMustBeginWithLowerCaseLetter 	字段名必須首字母小寫
SA1307	AccessibleFieldsMustBeginWithUpperCaseLetter 	public或者internal字段首字母大寫
SA1308	VariableNamesMustNotBePrefixed  	變量名不能有前綴
SA1309	FieldNamesMustNotBeginWithUnderscore  	字段名不能以下滑線開頭
SA1310	FieldNamesMustNotContainUnderscore   	字段名不能包括下滑線
SA1311	StaticReadonlyFieldsMustBeginWithUpperCaseLetter 	static與readonly字段首字母大寫
SA1312	VariableNamesMustBeginWithLowerCaseLetter	變量名必須是駝峰命名法
SA1313	ParameterNamesMustBeginWithLowerCaseLetter	參數名稱必須是駝峰命名法
SA1314	TypeParameterNamesMustBeginWithT	類型變量必須以T開頭
SX1309	FieldNamesMustBeginWithUnderscore	字段名稱必須是下划線開頭 這是netcore中官方建議的的編寫
SX1309S	StaticFieldNamesMustBeginWithUnderscore	靜態字段名稱必須是下划線開頭 這是netcore中官方建議的的編寫
SA1200	UsingDirectivesMustBePlacedWithinNamespace   	using部分必須在Namespace內部
SA1201	ElementsMustAppearInTheCorrectOrder 	所有的元素必須出現在正確的位置上(個人不建議使用該規則,用region把一個類文件里的元素分好組即可,字段
SA1202	ElementsMustBeOrderedByAccess  	元素的修飾符有一個固定的順序(個人不建議使用該規則,用region把一個類文件里的元素分好組即可,字段
SA1203	ConstantsMustAppearBeforeFields  	常量字段擺放在其它字段之上
SA1204	StaticElementsMustAppearBeforeInstanceElements Static  	元素擺放在前面
SA1205	PartialElementsMustDeclareAccess Partial	修飾的元素必須聲明讀寫權限
SA1206	DeclarationKeywordsMustFollowOrder 	舉例
SA1207	ProtectedMustComeBeforeInternal   	Protected在Internal之前
SA1208	SystemUsingDirectivesMustBePlacedBeforeOtherUsingDirectives  	系統級的引用在其他引用之前(格式化代碼就會自動按照這個規則編排using部分)
SA1209	UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives  	using部分起別名的在最后排布
SA1210	UsingDirectivesMustBeOrderedAlphabeticallyByNamespace  	using部分按照字母順序編排
SA1211	UsingAliasDirectivesMustBeOrderedAlphabeticallyByAliasName 	別名的按照別名的字母編排
SA1212	PropertyAccessorsMustFollowOrder  	屬性按照先get在set
SA1213	EventAccessorsMustFollowOrder  	時間先remove在add
SA1214	StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements  	StaticReadonly元素在StaticNonReadonly元素之前
SA1216	UsingStaticDirectivesMustBePlacedAtTheCorrectLocation	靜態指令按順序放
SA1217	UsingStaticDirectivesMustBeOrderedAlphabetically	靜態指令按順序放
SA1100	DoNotPrefixCallsWithBaseUnlessLocalImplementationExists	
SA1101	PrefixLocalCallsWithThis  	‘this.’前綴不能省略
SA1106	CodeMustNotContainEmptyStatements  	不允許有空白的聲明
SA1107	CodeMustNotContainMultipleStatementsOnOneLine 	同一行里不允許出現多個聲明語句
SA1108	BlockStatementsMustNotContainEmbeddedComments  	非法用例
SA1109	BlockStatementsMustNotContainEmbeddedRegions  	非法用例
SA1110	OpeningParenthesisMustBeOnDeclarationLine 	方法開始的括弧要在聲明的那一行
SA1111	ClosingParenthesisMustBeOnLineOfLastParameter  	方法結束括弧與最后一個參數同行
SA1112	ClosingParenthesisMustBeOnLineOfOpeningParenthesis  	如果是空參的情況,開始於結束括弧在同一行
SA1113	CommaMustBeOnSameLineAsPreviousParameter 	逗號必須與前一個參數同行
SA1114	ParameterListMustFollowDeclaration 	確保參數列表與開始括號同行,或者另起一行 參數整體要在同一行
SA1115	ParameterMustFollowComma 	參數與參數之間不能隔空白行
SA1116	SplitParametersMustStartOnLineAfterDeclaration  	所有參數在同一行或者如下示例
SA1117	ParametersMustBeOnSameLineOrSeparateLines   	同上
SA1118	ParameterMustNotSpanMultipleLines 	實際調用是參數要在同一行
SA1120	CommentsMustContainText  	注釋必須節點內部必須有文本
SA1121	UseBuiltInTypeAlias  	使用內嵌的類型別名
SA1122	UseStringEmptyForEmptyStrings 	示例代碼:“string s = string.Empty;”不能寫成” string s = ""; ”
SA1123	DoNotPlaceRegionsWithinElements  	不使用region(個人較反對這條,個人傾向於用region規整類里的元素)
SA1124	DoNotUseRegions  	不使用region(個人較反對這條,個人傾向於用region規整類里的元素)
SA1125	UseShorthandForNullableTypes  	使用簡寫版的可空類型 如”int?”
SA1126	PrefixCallsCorrectly  	調用類成員的時候要帶上“this”前綴
SA1127	GenericTypeConstraintsMustBeOnOwnLine	泛型約束必須在同一行
SA1128	ConstructorInitializerMustBeOnOwnLine	同上
SA1129	DoNotUseDefaultValueTypeConstructor	不要使用默認值類型構造函數。
SA1130	UseLambdaSyntax	使用Lambda表達式
SA1131	UseReadableConditions	使用可讀的條件
SA1132	DoNotCombineFields	
SA1133	DoNotCombineAttributes	
SA1134	AttributesMustNotShareLine	
SA1136	EnumValuesShouldBeOnSeparateLines	
SA1137	ElementsShouldHaveTheSameIndentation	
SA1139	UseLiteralSuffixNotationInsteadOfCasting	
SX1101	DoNotPrefixLocalMembersWithThis	
SA1000	KeywordsMustBeSpacedCorrectly  	關鍵字不能拼寫錯誤
SA1001	CommasMustBeSpacedCorrectly 	逗號前面擺放一個空格
SA1002	SemicolonsMustBeSpacedCorrectly 	 分號前面擺放一個空格
SA1003	SymbolsMustBeSpacedCorrectly  	操作符與元素之間不加空格
SA1004	DocumentationLinesMustBeginWithSingleSpace 	“///”注釋的每一行以一個空格開頭
SA1005	SingleLineCommentsMustBeginWithSingleSpace  	單行注釋以一個空格開頭
SA1006	PreprocessorKeywordsMustNotBePrecededBySpace  	預處理關鍵字內部不允許出現空格 如“# if Debug”是不允許的
SA1007	OperatorKeywordMustBeFollowedBySpace   	操作必須要在一個空格之后
SA1008	OpeningParenthesisMustBeSpacedCorrectly  	開始括弧放置合理的空格
SA1009	ClosingParenthesisMustBeSpacedCorrectly  	結尾括弧放置合理的空格
SA1010	OpeningSquareBracketsMustBeSpacedCorrectly 	開始方括號放置合理的空格
SA1011	ClosingSquareBracketsMustBeSpacedCorrectly   	結束方括號放置合理的空格
SA1012	OpeningCurlyBracketsMustBeSpacedCorrectly  	開始花括號放置合理的空格
SA1013	ClosingCurlyBracketsMustBeSpacedCorrectly 	結束花括號放置合理的空格
SA1014	OpeningGenericBracketsMustBeSpacedCorrectly 	同上
SA1015	ClosingGenericBracketsMustBeSpacedCorrectly 	同上
SA1016	OpeningAttributeBracketsMustBeSpacedCorrectly  	特性開始括號同上
SA1017	ClosingAttributeBracketsMustBeSpacedCorrectly 	特性結尾括號同上
SA1018	NullableTypeSymbolsMustNotBePrecededBySpace 	空類型前不放置空格
SA1019	MemberAccessSymbolsMustBeSpacedCorrectly  	成員訪問關鍵字前后有空格
SA1020	IncrementDecrementSymbolsMustBeSpacedCorrectly	自增自減關鍵字要有空格
SA1021	NegativeSignsMustBeSpacedCorrectly  	負號要有空格
SA1022	PositiveSignsMustBeSpacedCorrectly   	正號要有空格
SA1023	DereferenceAndAccessOfMustBeSpacedCorrectly	
SA1024	ColonsMustBeSpacedCorrectly  	冒號運算符要有空格
SA1025	CodeMustNotContainMultipleWhitespaceInARow  	同一行不允許出現多個空格
SA1026	CodeMustNotContainSpaceAfterNewKeywordInImplicitlyTypedArrayAllocation  	new關鍵字之后不允許出現空格
SA1027	TabsMustNotBeUsed  	不用tab字符
SA1028	CodeMustNotContainTrailingWhitespace	代碼后面不能有空格
SA0001	XmlCommentAnalysisDisabled	禁用XML注釋
SA0002	InvalidSettingsFile	無效的配置文件

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM