续接上篇:代码走查工具篇FxCop的规则总结与翻译_Part1
1、 AvoidDuplicateAccelerators CA1301
避免快捷键冲突,访问键也称为快捷键,它通过使用 Alt 键来实现对控件的键盘访问。如果多个控件具有重复的访问键,则访问键的行为定义不正确。用户可能无法使用访问键来访问目标控件,并可能启用目标控件以外的控件。该规则的当前实现忽略菜单项。不过,同一子菜单中的菜单项不应具有相同的访问键。
2、 DoNotHardcodeLocaleSpecificStrings CA1302
System.Environment.SpecialFolder 枚举包含表示特殊系统文件夹的成员。对于不同的操作系统,这些文件夹的位置可能具有不同的值,用户也可能会更改某些位置,或者这些位置已经进行了本地化。例如,System 文件夹就是一个特殊文件夹,该文件夹在 Windows XP 中为“C:\WINDOWS\system32”,而在 Windows 2000 中为“C:\WINNT\system32”。 Environment.GetFolderPath 方法返回与 Environment.SpecialFolder 枚举关联的位置。 GetFolderPath 返回的位置已进行了本地化,以便与目前运行的计算机相适应。该规则将使用 GetFolderPath 方法检索的文件夹路径标记到不同的目录级别。每个字符串都会与这些标记进行比较。如果找到匹配项,则假定该方法正在生成一个与该标记关联的表示系统位置的字符串。为了确保可移植性和可本地化性,请使用 GetFolderPath 方法来检索特殊文件夹的位置,而不要使用字符串。
3、 NormalizeStringsToUppercase CA1308
字符串转化的时候尽量转化成大写(举例,做字符串比较的时候),字符串应正常化为大写字母。少量字符转换为小写字母后不能再转换回来。往返转换即是将字符从一个区域设置转换为另一个表示不同字符数据的区域设置,然后准确地从转换后的字符中检索到原始字。
4、 SetLocaleForDataTypes CA1306
区域设置决定数据的区域性特定显示元素,例如,数值、货币符号和排序顺序所用的格式。在创建 DataTable 或 DataSet 时,应显式设置区域设置。默认情况下,这些类型的区域设置为当前区域性。对于存储在数据库或文件中并且全局共享的数据,通常应将区域设置设置为固定区域性 (CultureInfo.InvariantCulture)。当数据跨区域性共享时,使用默认区域设置可能导致 DataTable 或 DataSet 的内容无法正确显示或解释。
5、 SpecifyCultureInfo CA1304
指定区域语言,系统启动的时候设置一下当前区域语言里的时间格式,yyyy-MM-dd HH:mm:ss 这样每个画面如果没有给定format的话也不会在win7下出现 3/27/2013。
6、 SpecifyIFormatProvider CA1305
指定IFormatProvider, 同CA1304。
7、 SpecifyMarshalingForPInvokeStringArguments CA2101
在从 Unicode 转换为 ANSI 时,并不是所有的 Unicode 字符都能在特定的 ANSI 代码页中表示。最佳映射通过用一个字符替换无法表示的字符来解决此问题。使用此功能会导致潜在的安全漏洞,因为您无法控制选择的字符。例如,恶意代码会有意创建一个包含在特定代码页中无法找到的字符的 Unicode 字符串,而这些字符会转换为“..”或“/”等特殊的文件系统字符。另外还要注意,特殊字符的安全检查经常在将字符串转换为 ANSI 之前发生。
最佳映射是非托管转换(WChar 到 MByte)的默认设置。除非显式禁用了最佳映射,否则代码可能由于此问题而包含可利用的安全漏洞。
// Violates rule: SpecifyMarshalingForPInvokeStringArguments.
[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
internal static extern int RegCreateKey(IntPtr key, String subKey, out IntPtr result);
// Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
[DllImport("advapi32.dll", CharSet = CharSet.Unicode)]
internal static extern int RegCreateKey2(IntPtr key, String subKey, out IntPtr result);
8、 SpecifyMessageBoxOptions CA1300
要为使用从右向左阅读顺序的区域性正确显示消息框,必须将 MessageBoxOptions 枚举的 RightAlign 和 RtlReading 成员传递给 Show 方法。检查包含控件的Control.RightToLeft 属性以确定是否使用从右向左的阅读顺序。 CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft
9、 SpecifyStringComparison CA1307
许多字符串运算(其中最重要的是 Compare 和 Equals 方法)都提供接受 StringComparison 枚举值作为参数的重载。只要存在接受 StringComparison 参数的重载,就应用它来代替不接受此参数的重载。通过显式设置此参数,通常会使代码更清楚,更易于维护。
10、 UseOrdinalStringComparison CA1309
许多字符串运算(其中最重要的是 StringCompare() 和 StringEquals() 方法)现在都提供接受 StringComparision 枚举值作为参数的重载。当您指定 StringComparison.Ordinal 或 StringComparison.OrdinalIgnoreCase 时,字符串比较将是非语义的。也就是说,在进行比较判断时会忽略特定于自然语言的功能。这意味着,作出的判断基于简单的字节比较,并且忽略大小写或按区域性参数化的等值表。因此,通过将参数显式设置为 StringComparison.Ordinal 或StringComparison.OrdinalIgnoreCase,通常可以提高代码的速度、正确性和可靠性。
1、AutoLayoutTypesShouldNotBeComVisible CA1403
自动布局类型不应对 COM 可见,Auto 布局类型由公共语言运行时来管理。这些类型的布局因 .NET Framework 的版本不同而不同,这将中断要求特定布局的 COM 客户端。请注意,如果未指定StructLayoutAttribute 特性,则 C#、Visual Basic 和 C++ 编译器会为值类型指定 Sequential 布局。除非另行标记,否则所有公共的非泛型类型都对 COM 可见;所有非公共类型和泛型类型都对 COM 不可见。但是,为了减少误报,此规则要求显式声明类型的 COM 可见性;包含程序集必须用设置为 false 的 System.Runtime.InteropServices.ComVisibleAttribute 进行标记,类型必须用设置为 true 的 ComVisibleAttribute 进行标记。
2、AvoidInt64ArgumentsForVB6Clients CA1406
Visual Basic 6 COM 客户端不能访问 64 位整数。默认情况下,以下项对 COM 可见:程序集、公共类型、公共类型中的公共实例成员和公共值类型的所有成员。但是,为了减少误报,此规则要求显式声明类型的 COM 可见性;包含程序集必须用设置为 false 的 System.Runtime.InteropServices.ComVisibleAttribute 进行标记,类型必须用设置为 true 的 ComVisibleAttribute 进行标记。
3、由于暂时公司开发涉及不到这块,先不翻译................................
1、DoNotUseIdleProcessPriority CA1600
不要将进程优先级设置为 Idle。具有 System.Diagnostics.ProcessPriorityClass.Idle 优先级的进程将在 CPU 本应处于空闲状态时占用它,从而阻止进入待机状态。
2、DoNotUseTimersThatPreventPowerStateChanges CA1601
不要以高于每秒一次的频率进行轮询或使用触发频率高于每秒一次的计时器。频率较高的定期活动会使 CPU 处于繁忙状态,并且会干扰具有节能功能(关闭显示器和硬盘)的空闲计时器。
1、CompoundWordsShouldBeCasedCorrectly CA1702
标识符的名称根据大小写被拆分成几个单词。每两个连续的单词组合由 Microsoft 拼写检查器库进行检查。如果它被识别,该标识符将生成规则冲突。导致冲突的复合词示例包括“CheckSum”和“MultiPart”,它们的大小写分别应为“Checksum”和“Multipart”。由于以前经常使用,规则中置入了一些特例,一些单个的词也会被标记,例如“Toolbar”和“Filename”,应按照大小写规则将它们视为两个不同的单词(即“ToolBar”和“FileName”)。命名约定为所有针对公共语言运行时的库提供了通用的外观。
2、DoNotNameEnumValuesReserved CA1700
此规则假定当前不使用名称中包含“reserved”的枚举成员,而是将其作为一个占位符,以在将来的版本中重命名或移除它。重命名或移除成员是一项重大更改。您不应指望用户只因为成员名称包含“reserved”就会忽略该成员,也不能依赖用户阅读或遵守文档。而且,因为保留成员既出现在对象浏览器中也出现在智能集成开发环境中,它们可能对实际使用了哪个成员造成混淆。
在将来的版本中将不使用保留成员,而是向枚举添加新成员。在大多数情况下,只要添加新成员不会引起原始成员的值更改,添加新成员就不是重大更改。
在有限的几种情况下,即使原始成员保留其原始值,添加成员也属于重大更改。主要原因是,新成员在从现有代码路径返回时,必须中断对包含整个成员列表并在默认情况下引发异常的返回值使用 switch(在 Visual Basic 中为 Select)语句的调用方。其次,客户端代码可能不处理反射方法的行为的更改,如 Enum.IsDefined。因此,如果要从现有的方法返回具有新的成员,或者由于使用较差的反射而发生已知的应用程序不兼容,则唯一的无间断解决方法是:
添加一个新的枚举,其中包含原始成员和新成员。用 System.ObsoleteAttribute 特性标记原始枚举。
对任何外部可见并公开原始枚举的类型或成员均执行相同的过程。
3、DoNotPrefixEnumValuesWithTypeName CA1712
不要将类型名用作枚举值的前缀,枚举成员的名称不能以类型名称作为前缀,因为类型信息将由开发工具提供。命名约定为所有针对公共语言运行时的库提供了通用的外观。
4、EventsShouldNotHaveBeforeOrAfterPrefix CA1713
事件不应具有 before 或 after 前缀,事件名称应当说明引发事件的操作。若要命名按特定顺序引发的相关事件,请使用现在时或过去时指示一系列操作中的相对位置。例如,当命名关闭资源时引发的一对事件时,可以将其命名为“Closing”和“Closed”,而不是“BeforeClose”和“AfterClose”。
5、FlagsEnumsShouldHavePluralNames CA1714
Flags 枚举应采用复数形式的名称,标有 FlagsAttribute 的类型具有复数形式的名称,因为该特性指明可以指定多个值。例如,定义星期几的枚举可能打算在可以指定多天的应用程序中使用。此枚举应具有FlagsAttribute 并且可称为“Days”。只允许指定一天的类似枚举将没有该特性,并可称为“Day”。
6、IdentifiersShouldBeCasedCorrectly CA1709
标识符的大小写应当正确,命名约定为所有针对公共语言运行时的库提供了通用的外观。
按照约定,参数名使用 Camel 大小写;命名空间、类型和成员名称使用 Pascal 大小写。在采用 Camel 大小写格式的名称中,第一个字母为小写,名称中其他所有单词的第一个字母为大写。Camel 大小写形式的名称示例为“packetSniffer”、“ioFile”和“fatalErrorCode”。在采用 Pascal 大小写格式的名称中,第一个字母为大写,名称中其他所有单词的第一个字母为大写。Pascal 大小写形式的名称示例为“PacketSniffer”、“IOFile”和“FatalErrorCode”。
该规则根据大小写将名称拆分为若干单词,并依据常见的双字母单词(例如“In”或“My”)列表来检查所有双字母单词。如果未找到匹配项,则假定该单词是首字母缩略词。此外,此规则假定发现一个首字母缩略词,其名称在一行中包含四个大写字母,或在名称的结尾发现一行中有三个大写字母。
按照约定,双字母的首字母缩略词全部使用大写字母,含三个或三个以上字符的首字母缩略词则使用 Pascal 大小写形式。下面的示例使用该命名约定:“DB”、“CR”、“Cpa”和“Ecma”。下面的示例与该约定冲突:“Io”、“XML”和“DoD”;对于非参数名称,冲突的示例有“xp”和“cpl”。
“ID”是一种导致与该规则冲突的特殊情况。'Id”不是首字母缩略词,而是“identification”的缩写。
7、IdentifiersShouldBeSpelledCorrectly CA1704
标识符应正确拼写,此规则将标识符解析为标记并检查每个标记的拼写。解析算法执行下列转换:
一个新标记以大写字母开头。例如,MyNameIsJoe 被解析为“My”、“Name”、“Is”和“Joe”标记。
对于多个大写字母,最后一个大写字母开始一个新标记。例如,GUIEditor 被解析为“GUI”和“Editor”标记。
移除前导和尾随撇号。例如,“'sender'”被解析为“sender”标记。
下划线表示一个标记的结尾,并被移除。例如,Hello_world 被解析为“Hello”和“world”标记。
嵌入的与号将被移除。例如,for&mat 被解析为“format”标记。
默认情况下,使用拼写检查器的英语 (en) 版本。目前没有其他语言字典。
8、IdentifiersShouldDifferByMoreThanCase CA1708
标识符不应仅以大小写进行区分,不能仅通过大小写区分命名空间、类型、成员和参数的标识符,因为针对公共语言运行时的语言不需要区分大小写。
9、IdentifiersShouldHaveCorrectPrefix CA1715
标识符应具有正确的前缀,按照约定,某些编程元素的名称以特定前缀开头。
接口名称应以大写字母“I”开头,后跟另一个大写字母。泛型类型参数名称应以大写字母“T”开头,后面可跟另一个大写字母。
10、IdentifiersShouldHaveCorrectSuffix CA1715
标识符应具有正确的后缀,
基类型/接口 |
后缀 |
System.Attribute |
特性 |
System.EventArgs |
EventArgs |
System.Exception |
异常 |
System.Collections.ICollection |
Collection |
System.Collections.IDictionary |
Dictionary |
System.Collections.IEnumerable |
Collection |
System.Collections.Queue |
Collection 或 Queue |
System.Collections.Stack |
Collection 或 Stack |
System.Collections.Generic.ICollection<T> |
Collection |
System.Collections.Generic.IDictionary<TKey, TValue> |
Dictionary |
System.Data.DataSet |
数据集 |
System.Data.DataTable |
Collection 或 DataTable |
System.IO.Stream |
流 |
System.Security.IPermission |
权限 |
System.Security.Policy.IMembershipCondition |
Condition |
事件处理程序委托。 |
EventHandler |
11、IdentifiersShouldNotContainTypeNames CA1720
标识符不应包含类型名称。
12、IdentifiersShouldNotContainUnderscores CA1707
标识符不应包含下滑线。
13、IdentifiersShouldNotHaveIncorrectPrefix CA1722
与CA1715对应
14、IdentifiersShouldNotHaveIncorrectSuffix CA1711
与CA1710对应
15、IdentifiersShouldNotMatchKeywords CA1716
标识符不应与关键字冲突。
16、OnlyFlagsEnumsShouldHavePluralNames CA1717
只有 FlagsAttribute 枚举应采用复数形式的名称。命名约定规定,复数形式的枚举名称表示可以同时指定多个枚举值。 FlagsAttribute 通知编译器应将枚举视为一个位字段,允许对枚举执行按位运算。
如果一次只能指定一个枚举值,枚举的名称应为单数形式的单词。例如,定义星期几的枚举可能打算在可以指定多天的应用程序中使用。此枚举应具有 FlagsAttribute 并且可称为“Days”。只允许指定一天的类似枚举将没有该特性,并可称为“Day”。
17、ParameterNamesShouldMatchBaseDeclaration CA1725
参数名应与基方法中的声明保持一致。
18、ParameterNamesShouldNotMatchMemberNames CA1719
参数名不应与成员名冲突。
19、PropertyNamesShouldNotMatchGetMethods CA1721
属性名不应与 get 方法冲突,造成的原因,公共或受保护成员的名称以“Get”开头,且其余部分与公共或受保护属性的名称匹配。例如,包含名为“GetColor”的方法和名为“Color”的属性的类型与该规则冲突。
20、ResourceStringCompoundWordsShouldBeCasedCorrectly CA1701
资源字符串应该采取正确的大小写,
21、ResourceStringsShouldBeSpelledCorrectly CA1703
资源字符串应该采取正确的大小写,
22、TypeNamesShouldNotMatchNamespaces CA1724
类型名不应与命名空间冲突
23、UsePreferredTerms CA1726
使用首选词条,此规则将标识符分析为标记。将对照规则中内置的词条(位于任何自定义字典的“已否决”部分)比较每个单一标记和每个连续的双标记组合。下表演示该规则中内置的词条以及它们的首选备用词条。
过时的词条 |
首选词条 |
Arent |
AreNot |
Cancelled |
Canceled |
Cant |
Cannot |
ComPlus |
EnterpriseServices |
Couldnt |
CouldNot |
Didnt |
DidNot |
Doesnt |
DoesNot |
Dont |
DoNot |
Flag 或 Flags |
无替代词条。不使用。 |
Hadnt |
HadNot |
Hasn’t |
HasNot |
Havent |
HaveNot |
Indices |
Indexes |
Isnt |
IsNot |
LogIn |
LogOn |
LogOut |
LogOff |
Shouldnt |
ShouldNot |
SignOn |
SignIn |
SignOff |
SignOut |
Wasnt |
WasNot |
Werent |
WereNot |
Wont |
WillNot |
Wouldnt |
WouldNot |
Writeable |
Writable |