C# 代碼規范和質量檢查工具 StyleCop.Analyzers
簡介
原來一直用 ReSharper 來進行代碼質量檢查,不過畢竟是收費的,所以想找個免費的可以推廣給公司的同事也一起用。搜索了一下,找到了StyleCop,但是我在 VS 2015里安裝 StyleCop 或者通過 Nuget 包安裝 StyleCop.MSBuild,雖然編譯以后能把 warning 顯示在 Error List 中,但是無法通過 項目---右鍵 配置 StyleCop 的規則,最終在找到了一個 StyleCopAnalyzers 也算是 StyleCop 的新版本吧。
主要使用了 Visual Studio 2015's Roslyn 分析工具,帶來了以下的好處:
- 可以支持 C# 6
- 使用 Roslyn 解析器,減少了自定義解析器的性能消耗
- 當你寫代碼的時候解析器就會運行,當你編譯的時候也會運行(不需要再設置 msbuild 任務或者安裝任何 vs 插件)
安裝
安裝的話比較簡單,在項目里管理 NuGet 包,輸入 StyleCop.Analyzers 然后安裝就可以了
安裝完成就直接可以看到效果了,StyleCop.Analyzers 會像 ReSharper 那樣在你寫代碼的時候就提示錯誤,而不用編譯以后才發現錯誤了。
不過編譯以后還是會把所有的錯誤提示顯示出來
配置自定義規則
在上面的圖片里,可以看到我的項目一共有32個 StyleCop 警告,下面我們就把 SA1652 警告去除。
找到引用里得 Analyzer,右鍵點擊 Open Active Rule Set,就可以打開規則表
然后找到 StyleCop.Analyzers 的規則 SA1652,取消勾選,然后保存。
最終會在項目里生成一個 .ruleset 后綴的文件就是我們的自定義規則。
編譯以后查看效果,就會發現前面提示的 SA1652 的警告已經沒有了。
一、StyleCop是微軟的一個開源的靜態代碼分析工具,檢查c#代碼一致性和編碼風格。
二、下載地址 http://stylecop.codeplex.com/releases/view/79972
默認安裝目錄:C:\Program Files (x86)\StyleCop 4.7
自己定義的dll規則也放在這個目錄下
三、使用方式:打開VS之后選擇一個類或者一個類庫右擊
RunStyleCop運行結果:
四:編寫自己的規則:
1、創建一個類庫,
新建一個MyCustomAnalyzer.cs文件,引用StyleCop.dll和StyleCop.Csharp.dll
代碼如下:
using StyleCop; using StyleCop.CSharp; namespace MyCustomRules { /// <summary> /// Custom analyzer for demo purposes. /// </summary> [SourceAnalyzer(typeof(CsParser))] public class MyCustomAnalyzer : SourceAnalyzer { /// <summary> /// Extremely simple analyzer for demo purposes. /// </summary> public override void AnalyzeDocument(CodeDocument document) { CsDocument doc = (CsDocument)document; // skipping wrong or auto-generated documents if (doc.RootElement == null || doc.RootElement.Generated) return; // check all class entries doc.WalkDocument(CheckClasses); } /// <summary> /// Checks whether specified element conforms custom rule CR0001. /// </summary> private bool CheckClasses( CsElement element, CsElement parentElement, object context) { // if current element is not a class then continue walking if (element.ElementType != ElementType.Class) return true; // check whether class name contains "a" letter Class classElement = (Class)element; if (classElement.Declaration.Name.Contains("a")) { // add violation // (note how custom message arguments could be used) AddViolation( classElement, classElement.Location, "AvoidUsingAInClassNames", classElement.FriendlyTypeText); } // continue walking in order to find all classes in file return true; } } }
AddViolation方法中的三個參數"AvoidUsingAInClassNames"是自己定義的規則,這個規則就是下文xml中的 Rule Name="AvoidUsingAInClassNames"
2、新建一個和類同名的xml文件
MyCustomAnalyzer.xml內容如下:
<?xml version="1.0" encoding="utf-8" ?> <SourceAnalyzer Name="My Custom Rule"> <Description> Custom rule for demo purposes. </Description> <Rules> <Rule Name="AvoidUsingAInClassNames" CheckId="CR0001"> <Context>不能用A字母</Context> <Description>Fires when ‘a‘ letter is used in class name.</Description> </Rule> </Rules> </SourceAnalyzer>
設置該xml文件屬性:編譯方式為嵌入式 (即編譯到dll中),Rules中可以放多個Rule但不要忘了改Name和Id
3、保存並編譯
將這個項目生成DLL,把MyCustomAnalyzer.dll放到StyleCop根目錄下。到此自定義規則就完成了。
4、使用自己的規則:
打開VS之后選擇一個類或者一個類庫右擊,選擇 StyleCop Settings設置規則,這里可以看到自己新添的規則。
C#代碼規范和質量檢查工具
代碼風格檢查:StyleCop
The StyleCop tool provides warnings that indicate style and consistency rule violations in C# code. The warnings are organized into rule areas such as documentation, layout, naming, ordering, readability, spacing, and so forth. Each warning signifies a violation of a style or consistency rule.
代碼缺陷檢查:FxCop
代碼分析工具,幫助您檢測和更正代碼缺陷。
托管代碼代碼分析工具分析托管程序集並報告有關程序集的信息,例如 Microsoft .NET Framework 設計准則中規定的編程和設計規則的沖突。分析工具將它在分析期間執行的檢查表示為警告。
代碼質量: 代碼度量值/Code Metrics
代碼度量是一組軟件度量值,使開發人員可以更好地了解他們正在開發的代碼。利用代碼度量,開發人員可以了解哪些類型和/或方法應該返工或進行更徹底的測試。開發團隊可以識別潛在的風險、了解項目的當前狀態,並跟蹤軟件開發的進度。
在StyleCop中有一些官方自己寫好的檢測規則下面就是英文的解釋
文檔規則
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 各個參數的注解不能完全相同(避免copy、post行為)
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()
{
}
2、SA1501:StatementMustNotBeOnASingleLine 語句不能共享一行
3、SA1502:ElementMustNotBeOnASingleLine 語句不能共享一行
4、SA1503:CurlyBracketsMustNotBeOmitted 花括弧即使在單行代碼的情況下也不能省略。
5、SA1504:AllAccessorsMustBeSingleLineOrMultiLine 讀寫屬性,要么在同一行業要么在分多行寫,不可規則不統一(個人建議分多行寫)。
6、SA1505:OpeningCurlyBracketsMustNotBeFollowedByBlankLine 開始的花括弧后面不能有空白行
7、SA1506:ElementDocumentationHeadersMustNotBeFollowedByBlankLine 元素頭部注釋跟元素之間不能有空白行
8、SA1507:CodeMustNotContainMultipleBlankLinesInARow 不允許有多行空白行緊挨着(個人建議寫一個空白行即可)
9、SA1508:ClosingCurlyBracketsMustNotBePrecededByBlankLine 結尾的花括弧不能再一個空白行之前
10、SA1509:OpeningCurlyBracketsMustNotBePrecededByBlankLine 開始的花括弧不能再一個空白行之前
11、SA1510:ChainedStatementBlocksMustNotBePrecededByBlankLine 相連的語句之間不能有空白行,如try語句與catch語句之間不能有空白行
12、SA1511:WhileDoFooterMustNotBePrecededByBlankLine 與SA1510相同,Do語句與While語句之間不能有空白行
13、SA1512:SingleLineCommentsMustNotBeFollowedByBlankLine 單行注釋不能后跟空白行
14、SA1513:ClosingCurlyBracketMustBeFollowedByBlankLine 結束花括弧之后必須有一個空白行
15、SA1514:ElementDocumentationHeaderMustBePrecededByBlankLine 頭部注解之前必須有一個空白行
16、SA1515:SingleLineCommentMustBePrecededByBlankLine 單行注釋之前要有一個空白行,還一種方法是不加空白行而用四個斜線注釋”////”,建議采取第一種方法
17、SA1516:ElementsMustBeSeparatedByBlankLine 鄰近的元素之間要有一個空白行
18、SA1517:CodeMustNotContainBlankLinesAtStartOfFile 代碼文件頭部字符之前不能出現空白行
19、SA1518: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字段首字母大寫
排序規則
1、SA1200:UsingDirectivesMustBePlacedWithinNamespace using部分必須在Namespace內部(個人不建議用這個規則)
2、SA1201:ElementsMustAppearInTheCorrectOrder 所有的元素必須出現在正確的位置上(個人不建議使用該規則,用region把一個類文件里的元素分好組即可,字段、屬性、對外公布的接口、私有方法等組)
3、SA1202:ElementsMustBeOrderedByAccess 元素的修飾符有一個固定的順序(個人不建議使用該規則,用region把一個類文件里的元素分好組即可,字段、屬性、對外公布的接口、私有方法等組)
4、SA1203:ConstantsMustAppearBeforeFields 常量字段擺放在其它字段之上
5、SA1204:StaticElementsMustAppearBeforeInstanceElements Static 元素擺放在前面
6、SA1205:PartialElementsMustDeclareAccess Partial修飾的元素必須聲明讀寫權限
7、SA1206:DeclarationKeywordsMustFollowOrder 舉例:
keywords must appear in the following order:
Access modifiers
static
All other keywords
8、SA1207:ProtectedMustComeBeforeInternal Protected在Internal之前
9、SA1208:SystemUsingDirectivesMustBePlacedBeforeOtherUsingDirectives 系統級的引用在其他引用之前(格式化代碼就會自動按照這個規則編排using部分)
10、SA1209:UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives using部分起別名的在最后排布
11、SA1210:UsingDirectivesMustBeOrderedAlphabeticallyByNamespace using部分按照字母順序編排
12、SA1211:UsingAliasDirectivesMustBeOrderedAlphabeticallyByAliasName 別名的按照別名的字母編排
13、SA1212:PropertyAccessorsMustFollowOrder 屬性按照先get在set
14、SA1213:EventAccessorsMustFollowOrder 時間先remove在add
15、SA1214:StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements StaticReadonly元素在StaticNonReadonly元素之前
16、SA1215: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 所有參數在同一行或者如下示例:
public string JoinName(
string first,
string last)
18、SA1117:ParametersMustBeOnSameLineOrSeparateLines 同上
19、SA1118:ParameterMustNotSpanMultipleLines 實際調用是參數要在同一行
20、SA1120:CommentsMustContainText 注釋必須節點內部必須有文本
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字符(個人不建議采用這條)