1. 程式人生 > >程式碼走查工具篇SytleCop的規則總結與翻譯

程式碼走查工具篇SytleCop的規則總結與翻譯

    SourceAnalysis StyleCop)的終極目標是讓所有人都能寫出優雅和一致的程式碼,因此這些程式碼具有很高的可讀性。 早就聽說了微軟內部的靜態程式碼檢查和程式碼強制格式美化工具 StyleCop , 2008-05-23微軟在 MSDN Code Gallery 釋出了 4.2 版本,並命名為 Microsoft Source Analysis for C# 。 SourceAnalysis StyleCop)不是程式碼格式化(程式碼美化)工具,而是程式碼規範檢查工具(Code Review 工具),它不僅僅檢查程式碼格式,而是編碼規範,包括命名和註釋等。 SourceAnalysis 

StyleCop)目的是幫助專案團隊執行一系列常用的原始碼格式規範,這些規範是關於如何開發佈局規整,易讀,易維護並且文件良好的優雅程式碼的(help teams enforce a common set of best practices for layout, readability, maintainability, and documentation of C# source code)。 SourceAnalysis StyleCop) 現在包含了 200 個左右的最佳實踐規則(best practice rules),這些規則與 Visual Studio IDE 中預設的程式碼格式化規則是一致的。 SourceAnalysis 
StyleCop)可以作為 Visual studio 的外掛執行,在VS中(我的是VS2012)對一個C#檔案點選右鍵後的:  在VS執行後,執行效果如

     

同時 SourceAnalysis StyleCop)也可以作為 MSBuild 任務(安裝時有選項)通過命令列執行。 從我現在的瞭解,SourceAnalysis StyleCop)只是一個程式碼格式的檢查工具,它會根據預定義的C#程式碼格式的最佳實踐,對我們的原始碼進行檢查,並給出不符合編碼風格的錯誤提示。

所有規則的翻譯(基於版本4.7.44.0)

文件規則

1、SA1600:ElementsMustBeDocumented元素必須添加註釋

2、SA1601: PartialElementsMustBeDocumented   Partial修飾的成員必須添加註釋

3、SA1602:EnumerationItemsMustBeDocumented 列舉必須添加註釋

4、SA1603: DocumentationMustContainValidXml  註釋必須合法(註釋中的關鍵字不能有錯誤)

5、SA1604: ElementDocumentationMustHaveSummary 元素註釋必須包含Summary關鍵字

6、SA1605:PartialElementDocumentationMustHaveSummary   Partial修飾的成員註釋必須包含Summary關鍵字

7、SA1606:ElementDocumentationMustHaveSummaryText   Summary節點內部必須新增文字

8、SA1607:PartialElementDocumentationMustHaveSummaryText  Partial修飾的成員註釋Summary節點內部必須新增文字

9、SA1608:ElementDocumentationMustNotHaveDefaultSummary  Summary註釋不能使用編譯器自帶的註釋文字

10、SA1609:PropertyDocumentationMustHaveValue   屬性的註釋中必須包含<Value>節點

11、SA1610:PropertyDocumentationMustHaveValueText  屬性的註釋<Value>節點必須包含文字值

12、SA1611:ElementParametersMustBeDocumented   引數必須註釋

13、SA1612:ElementParameterDocumentationMustMatchElementParameters  引數的個數必須與註釋裡的個數一致

14、SA1613:ElementParameterDocumentationMustDeclareParameterName 引數的註釋裡必須有引數的名稱

15、SA1614:ElementParameterDocumentationMustHaveText    引數註釋節點裡不能空著

16、SA1615:ElementReturnValueMustBeDocumented  返回值必須添加註釋

17、SA1616:ElementReturnValueDocumentationMustHaveText  返回值註釋的節點內必須有文字值

18、SA1617:VoidReturnValueMustNotBeDocumented 空返回值一定不能有返回值註釋

19、SA1618:GenericTypeParametersMustBeDocumented 生成的型別(泛型)引數必須有註釋

20、SA1619:GenericTypeParametersMustBeDocumentedPartialClass  SA1618情況如果有Partial類存在都要有註釋

21、SA1620:GenericTypeParameterDocumentationMustMatchTypeParameters 註釋與泛型必須能匹配上

22、SA1621:GenericTypeParameterDocumentationMustDeclareParameterName 泛型的註釋必須包含泛型定義是的關鍵字(’T’)

23、SA1622:GenericTypeParameterDocumentationMustHaveText  泛型的註釋節點中必須包含文字值

24、SA1623:PropertySummaryDocumentationMustMatchAccessors  屬性的註釋必須與屬性的讀寫許可權匹配,private型別的屬性不能出現在註釋裡

25、SA1624:PropertySummaryDocumentationMustOmitSetAccessorWithRestrictedAccess 屬性的註釋裡必須忽略protected關鍵字,當成public型別當註釋

26、SA1625:ElementDocumentationMustNotBeCopiedAndPasted  各個引數的註解不能完全相同(避免copypost行為)

27、SA1626:SingleLineCommentsMustNotUseDocumentationStyleSlashes  單行註釋不能採取三個斜線的註釋方式,斜線的個數必須是二的倍數

28、SA1627:DocumentationTextMustNotBeEmpty   註釋節點內部不能為空(必須有文字值)

29、SA1628:DocumentationTextMustBeginWithACapitalLetter  註釋節點內部的文字必須以大寫字母開頭

30、SA1629:DocumentationTextMustEndWithAPeriod  註釋節點內部的文字必須英文的句號結束

31、SA1630:DocumentationTextMustContainWhitespace  註釋節點內部的文字必須包含空格

32、SA1631:DocumentationMustMeetCharacterPercentage 註釋節點內部的文字中不能包含過多的字元(舉例:包含’---------------------------------------’是不允許的)

33、SA1632:DocumentationTextMustMeetMinimumCharacterLength  已經作廢的規則,不允許有太短的字串(’A name’ 中的A字母)

34、SA1633:FileMustHaveHeader   程式碼檔案頭部必須有說明,一般放置版權資訊

35、SA1634:FileHeaderMustShowCopyright   程式碼檔案頭部註解中必須包含版權關鍵字

36、SA1635:FileHeaderMustHaveCopyrightText程式碼檔案頭部註解中必須包含版權資訊內同

37、SA1636:FileHeaderCopyrightTextMustMatch  程式碼檔案頭部註解中版權資訊必須與設定畫面設定的內容相匹配,在”style seting”畫面的”Company Information tab”進行設定

38、SA1637:FileHeaderMustContainFileName  程式碼檔案頭部註解中必須包含檔名稱

39、SA1638:FileHeaderFileNameDocumentationMustMatchFileName  程式碼檔案頭部註解中必須包含檔名稱必須與實際的名稱匹配

40、SA1639:FileHeaderMustHaveSummary  程式碼檔案頭部註解中必須包含Summary節點

41、SA1640:FileHeaderMustHaveValidCompanyText 程式碼檔案頭部註解中版權資訊必須含有合理的公司名字

42、SA1641:FileHeaderCompanyNameTextMustMatch  程式碼檔案頭部註解中的公司名字必須與設定畫面設定的內容相匹配,在”style seting”畫面的”Company Information tab”進行設定

43、SA1642:ConstructorSummaryDocumentationMustBeginWithStandardText  建構函式註釋標準:“Initializes a new instance of the <see cref="Customer{T}"/> class.”

44、SA1643:DestructorSummaryDocumentationMustBeginWithStandardText  解構函式註釋標準:“Finalizes an instance of the <see cref="Customer"/> class.”

45、SA1644:DocumentationHeadersMustNotContainBlankLines   註釋中不能出現空白行

46、SA1645:IncludedDocumentationFileDoesNotExist   如果註釋中包含檔案,要確定這個檔案存在,舉例:“       /// <include file="IncludedDocumentation.xml" path="root/EnabledMethodDocs" />” 這一項過於複雜不建議用,但是如果將來想規範化相同共性東西的註釋的時候倒是可以考慮引入。

47、SA1646:IncludedDocumentationXPathDoesNotExist  如果註釋中包含檔案,路徑不存在。

48、SA1647:IncludeNodeDoesNotContainValidFileAndPath  如果註釋中包含檔案 檔案與路徑都要合法

49、SA1648:InheritDocMustBeUsedWithInheritingClass   這項不明白是什麼意思,還請知道的分享給我,謝謝。

50、SA1649:FileHeaderFileNameDocumentationMustMatchTypeName  檔案頭註釋必須匹配型別

51、SA1650:ElementDocumentationMustBeSpelledCorrectly 註釋不能有拼寫錯誤(對中文支援不好,不建議使用該項)

佈局規則

1、 SA1500:CurlyBracketsForMultiLineStatementsMustNotShareLine  花括號不能再同一行。

標準格式:  public StRsvrRFun()

         {

          }

2SA1501:StatementMustNotBeOnASingleLine   語句不能共享一行

3SA1502:ElementMustNotBeOnASingleLine   語句不能共享一行

4SA1503:CurlyBracketsMustNotBeOmitted  花括弧即使在單行程式碼的情況下也不能省略。

5SA1504:AllAccessorsMustBeSingleLineOrMultiLine  讀寫屬性,要麼在同一行業要麼在分多行寫,不可規則不統一(個人建議分多行寫)

6SA1505:OpeningCurlyBracketsMustNotBeFollowedByBlankLine 開始的花括弧後面不能有空白行

7SA1506:ElementDocumentationHeadersMustNotBeFollowedByBlankLine 元素頭部註釋跟元素之間不能有空白行

8SA1507:CodeMustNotContainMultipleBlankLinesInARow 不允許有多行空白行緊挨著(個人建議寫一個空白行即可)

9SA1508:ClosingCurlyBracketsMustNotBePrecededByBlankLine 結尾的花括弧不能再一個空白行之前

10SA1509:OpeningCurlyBracketsMustNotBePrecededByBlankLine  開始的花括弧不能再一個空白行之前

11SA1510:ChainedStatementBlocksMustNotBePrecededByBlankLine 相連的語句之間不能有空白行,如try語句與catch語句之間不能有空白行

12SA1511:WhileDoFooterMustNotBePrecededByBlankLine  與SA1510相同,Do語句與While語句之間不能有空白行

13SA1512:SingleLineCommentsMustNotBeFollowedByBlankLine 單行註釋不能後跟空白行

14SA1513:ClosingCurlyBracketMustBeFollowedByBlankLine 結束花括弧之後必須有一個空白行

15SA1514:ElementDocumentationHeaderMustBePrecededByBlankLine 頭部註解之前必須有一個空白行

16SA1515:SingleLineCommentMustBePrecededByBlankLine 單行註釋之前要有一個空白行,還一種方法是不加空白行而用四個斜線註釋”////”,建議採取第一種方法

17SA1516:ElementsMustBeSeparatedByBlankLine 鄰近的元素之間要有一個空白行

18SA1517:CodeMustNotContainBlankLinesAtStartOfFile 程式碼檔案頭部字元之前不能出現空白行

19SA1518:CodeMustNotContainBlankLinesAtEndOfFile程式碼檔案尾部字元之後不能出現空白行

可維護規則

1、 SA1119:StatementMustNotUseUnnecessaryParenthesis  語句中不可以出現多餘的括弧,無意義的括弧增加了程式碼的可讀性

2、 SA1400:AccessModifierMustBeDeclared  必須定義訪問修飾符

3、 SA1401:FieldsMustBePrivate  欄位必須定義為私有的

4、 SA1402:FileMayOnlyContainASingleClass 一個CS檔案裡只定義一個類

5、 SA1403:FileMayOnlyContainASingleNamespace  一個CS檔案只包含一個名稱空間

6、 SA1404:CodeAnalysisSuppressionMustHaveJustification   Suppression特性(取消報告特定的靜態分析工具規則衝突,允許一個程式碼專案上應用多個取消報告設定)必須要有合理理由

7、 SA1405:DebugAssertMustProvideMessageText 參見程式碼:“Debug.Assert(value != true, "The value must always be true.");”

8、 SA1406:DebugFailMustProvideMessageText   參見程式碼:“Debug.Fail("The code should never reach this point.");”

9、 SA1407:ArithmeticExpressionsMustDeclarePrecedence 算數表示式必須用明確的標明其優先順序(此條與SA1119衝突)

10、 SA1408:ConditionalExpressionsMustDeclarePrecedence 條件表示式必須明確的標明其優先順序(此條與SA1119衝突舉例:“if (x || (y && z && a) || b)”

11、 SA1409:RemoveUnnecessaryCode  移除無用的程式碼

12、 SA1410:RemoveDelegateParenthesisWhenPossible  呼叫一個c#匿名方法不包含任何方法引數,必須要包括一個空括號(本人不建議使用匿名方法、匿名委託的語法,具體原因後續做分享)

13、 SA1411:AttributeConstructorMustNotUseUnnecessaryParenthesis 特性建構函式如果是空參的形式,不要包括那個空括號

命名規則

1、 SA1300:ElementMustBeginWithUpperCaseLetter  首字母必須大寫(個人理解應該是欄位以外的東西)

2、 SA1301: ElementMustBeginWithLowerCaseLetter  不會出現的情況

3、 SA1302:InterfaceNamesMustBeginWithI  介面必須以“I”字母開頭

4、 SA1303:ConstFieldNamesMustBeginWithUpperCaseLetter Const常量首字母大寫

5、 SA1304:NonPrivateReadonlyFieldsMustBeginWithUpperCaseLetter 非私有非制度的欄位必須首字母大寫

6、 SA1305:FieldNamesMustNotUseHungarianNotation 除了列表外的字元不可以出現匈牙利命名規則,”Style Setting”裡的”Hungarian”Tab裡設定

7、 SA1306:FieldNamesMustBeginWithLowerCaseLetter 欄位名必須首字母小寫

8、 SA1307:AccessibleFieldsMustBeginWithUpperCaseLetter public或者internal欄位首字母大寫

9、 SA1308:VariableNamesMustNotBePrefixed  變數名不能有字首

10、 SA1309:FieldNamesMustNotBeginWithUnderscore  欄位名不能以下滑線開頭

11、 SA1310:FieldNamesMustNotContainUnderscore   欄位名不能包括下滑線

12、 SA1311:StaticReadonlyFieldsMustBeginWithUpperCaseLetter static與readonly欄位首字母大寫

排序規則

1SA1200:UsingDirectivesMustBePlacedWithinNamespace   using部分必須在Namespace內部(個人不建議用這個規則)

2SA1201:ElementsMustAppearInTheCorrectOrder 所有的元素必須出現在正確的位置上(個人不建議使用該規則,用region把一個類檔案裡的元素分好組即可,欄位、屬性、對外公佈的介面、私有方法等組)

3SA1202:ElementsMustBeOrderedByAccess  元素的修飾符有一個固定的順序(個人不建議使用該規則,用region把一個類檔案裡的元素分好組即可,欄位、屬性、對外公佈的介面、私有方法等組)

4SA1203:ConstantsMustAppearBeforeFields  常量欄位擺放在其它欄位之上

5SA1204:StaticElementsMustAppearBeforeInstanceElements Static  元素擺放在前面

6SA1205:PartialElementsMustDeclareAccess Partial修飾的元素必須宣告讀寫許可權

7SA1206:DeclarationKeywordsMustFollowOrder 舉例:

keywords must appear in the following order:

Access modifiers

static

All other keywords

8SA1207:ProtectedMustComeBeforeInternal   Protected在Internal之前

9SA1208:SystemUsingDirectivesMustBePlacedBeforeOtherUsingDirectives  系統級的引用在其他引用之前(格式化程式碼就會自動按照這個規則編排using部分)

10SA1209:UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives  using部分起別名的在最後排布

11SA1210:UsingDirectivesMustBeOrderedAlphabeticallyByNamespace  using部分按照字母順序編排

12SA1211:UsingAliasDirectivesMustBeOrderedAlphabeticallyByAliasName 別名的按照別名的字母編排

13SA1212:PropertyAccessorsMustFollowOrder  屬性按照先getset

14SA1213:EventAccessorsMustFollowOrder  時間先removeadd

15SA1214:StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements  StaticReadonly元素在StaticNonReadonly元素之前

16SA1215:InstanceReadonlyElementsMustAppearBeforeInstanceNonReadonlyElements 

一個readonly 例項元素要在一個非readonly 例項元素

可讀性規則

1、 SA1100:DoNotPrefixCallsWithBaseUnlessLocalImplementationExists

change the ‘base.’ prefix to ‘this.’.

2、 SA1101:PrefixLocalCallsWithThis  ‘this.’字首不能省略

3、 SA1102:QueryClauseMustFollowPreviousClause   linq語句要麼同一行,要麼關鍵字分佈在多行,關鍵字對齊

4、 SA1103:QueryClausesMustBeOnSeparateLinesOrAllOnOneLine 不是很理解

5、 SA1104:QueryClauseMustBeginOnNewLineWhenPreviousClauseSpansMultipleLines不是很理解

6、 SA1105:QueryClausesSpanningMultipleLinesMustBeginOnOwnLine不是很理解

7、 SA1106:CodeMustNotContainEmptyStatements  不允許有空白的宣告

8、 SA1107:CodeMustNotContainMultipleStatementsOnOneLine 同一行裡不允許出現多個宣告語句

9、 SA1108:BlockStatementsMustNotContainEmbeddedComments  非法用例:

if (x != y)

    // Make sure x does not equal y

    {

    }

10、 SA1109:BlockStatementsMustNotContainEmbeddedRegions  非法用例:

    if (x != y)

    #region

    {

    }

    #endregion

11、 SA1110:OpeningParenthesisMustBeOnDeclarationLine 方法開始的括弧要在宣告的那一行

12、 SA1111:ClosingParenthesisMustBeOnLineOfLastParameter  方法結束括弧與最後一個引數同行

13、 SA1112:ClosingParenthesisMustBeOnLineOfOpeningParenthesis  如果是空參的情況,開始於結束括弧在同一行

14、 SA1113:CommaMustBeOnSameLineAsPreviousParameter  逗號必須與前一個引數同行

15、 SA1114:ParameterListMustFollowDeclaration 

確保引數列表與開始括號同行,或者另起一行 引數整體要在同一行

16、 SA1115:ParameterMustFollowComma 引數與引數之間不能隔空白行

17、 SA1116:SplitParametersMustStartOnLineAfterDeclaration  所有引數在同一行或者如下示例:

publicstring JoinName(

        string first, 

        string last)

18SA1117:ParametersMustBeOnSameLineOrSeparateLines   同上

19SA1118:ParameterMustNotSpanMultipleLines 實際呼叫是引數要在同一行

20SA1120:CommentsMustContainText  註釋必須節點內部必須有文字

21SA1121:UseBuiltInTypeAlias  使用內嵌的類型別名,如下圖:

Type Alias

Type

Fully Qualified Type

bool

Boolean

System.Boolean

byte

Byte

System.Byte

char

Char

System.Char

decimal

Decimal

System.Decimal

double

Double

System.Double

short

Int16

System.Int16

int

Int32

System.Int32

long

Int64

System.Int64

object

Object

System.Object

sbyte

SByte

System.SByte

float

Single

System.Single

string

String

System.String

ushort

UInt16

System.UInt16

uint

UInt32

System.UInt32

ulong

UInt64

System.UInt64

22、SA1122:UseStringEmptyForEmptyStrings

示例程式碼:“string s = string.Empty;”不能寫成” string s = "";

23、SA1123:DoNotPlaceRegionsWithinElements  不使用region(個人較反對這條,個人傾向於用region規整類裡的元素)

24、SA1124:DoNotUseRegions  不使用region(個人較反對這條,個人傾向於用region規整類裡的元素)

25、SA1125:UseShorthandForNullableTypes  使用簡寫版的可空型別 如int?

26、SA1126:PrefixCallsCorrectly  呼叫類成員的時候要帶上“this”字首

拼寫規則

1、 SA1000:KeywordsMustBeSpacedCorrectly  關鍵字不能拼寫錯誤

2、 SA1001:CommasMustBeSpacedCorrectly 逗號前面擺放一個空格

3、 SA1002:SemicolonsMustBeSpacedCorrectly  分號前面擺放一個空格

4、 SA1003:SymbolsMustBeSpacedCorrectly  操作符與元素之間不加空格

5、 SA1004:DocumentationLinesMustBeginWithSingleSpace “///”註釋的每一行以一個空格開頭

6、 SA1005:SingleLineCommentsMustBeginWithSingleSpace  單行註釋以一個空格開頭

7、 SA1006:PreprocessorKeywordsMustNotBePrecededBySpace  預處理關鍵字內部不允許出現空格 如“# if Debug”是不允許的

8、 SA1007:OperatorKeywordMustBeFollowedBySpace   操作必須要在一個空格之後

9、 SA1008:OpeningParenthesisMustBeSpacedCorrectly  開始括弧放置合理的空格

10、 SA1009:ClosingParenthesisMustBeSpacedCorrectly  結尾括弧放置合理的空格

11、 SA1010:OpeningSquareBracketsMustBeSpacedCorrectly 開始方括號放置合理的空格

12、 SA1011:ClosingSquareBracketsMustBeSpacedCorrectly   結束方括號放置合理的空格

13、 SA1012:OpeningCurlyBracketsMustBeSpacedCorrectly  開始花括號放置合理的空格

14、 SA1013:ClosingCurlyBracketsMustBeSpacedCorrectly 結束花括號放置合理的空格

15、 SA1014:OpeningGenericBracketsMustBeSpacedCorrectly 同上

16、 SA1015:ClosingGenericBracketsMustBeSpacedCorrectly  同上

17、 SA1016:OpeningAttributeBracketsMustBeSpacedCorrectly  特性開始括號同上

18、 SA1017:ClosingAttributeBracketsMustBeSpacedCorrectly  特性結尾括號同上

19、 SA1018:NullableTypeSymbolsMustNotBePrecededBySpace 空型別前不放置空格

20、 SA1019:MemberAccessSymbolsMustBeSpacedCorrectly  成員訪問關鍵字前後有空格

21、 SA1020:IncrementDecrementSymbolsMustBeSpacedCorrectly 自增、自減關鍵字要有空格

22、 SA1021:NegativeSignsMustBeSpacedCorrectly  負號要有空格

23、 SA1022:PositiveSignsMustBeSpacedCorrectly   正號要有空格

24、 SA1023:DereferenceAndAccessOfMustBeSpacedCorrectly 

25、 SA1024:ColonsMustBeSpacedCorrectly  冒號運算子要有空格

26、 SA1025:CodeMustNotContainMultipleWhitespaceInARow  同一行不允許出現多個空格

27、 SA1026:CodeMustNotContainSpaceAfterNewKeywordInImplicitlyTypedArrayAllocation  new關鍵字之後不允許出現空格

28、 SA1027:TabsMustNotBeUsed  不用tab字元(個人不建議採用這條)

  由於個人英語水平有限,翻譯不妥之處還請各位同行多指點,謝謝。