Microsoft FxCop 的设计规则 .

FxCop 是一个代码分析工具,它依照 微软.NET 框架的设计规范对 托管代码assembly( 可称为 程序集assembly 实际上指的就是 .net 中的 .exe 或者 .dll 文件(不包括 netmodule 文件),这种文件中包含四种信息: assembly 的清单(包括引用外部的 assembly netmodule 资源文件及包含在同一文件中的 assembly );类型描述信息,包括版本信息与类的描述等; MSIL 微软 中间语言;资源(图标等) ) 进行检查。它使用基于规则的引擎,来检查出你代码中不合规范的部分;你也可以定制自己的规则加入到这个引擎。这个工具微软免费提供。最新版需要 .NET 2.0 支持;此外,也有一个较老的针对 .NET1.1 的版本。

最新版FxCop使用一项叫做内窥(introspection,或称内观、内视)的技术,以窥探你的 assembly内部,而前一个版本则使用映射(reflection,或称反射)技术。这一点值得关注,因为使用上一个版本调试碰到问题你不得不停下 来,对代码作了任何更改之后都需要重新开始调试;而这些对于新版本都没有必要了。

大多数代码分析工具扫描你的源代码, 但是FxCop直接对你编译好的代码处理。.NET的每个assembly都有其metadata(可称为元数据,metadata是关于一个 assembly中各元素的类型信息库,它本身也存放在这个assembly),它对assembly以及assembly内用到的所有类型进行描述。 FxCop会使用这个metadata以获知代码内部的运行状况。另外,它也对代码编译时生成的MSILMicrosoft Intermediate Language,微软中间语言)进行检查。

通过对metadataMSIL检查的结合,FxCop可以得出大量信息,以此获得对代码执行时所作所为的理解。它把你的代码和各条规则逐一比较检查,在每一个实例中,当找到不符合规则的代码时就生成一条消息。

FxCop Rule 翻译

一、Design Rules(设计规约)

1AbstractTypesShouldNotHaveConstructors    CA1012

不言而喻,抽象类型里即使编写了构造函数也不能直接的调用到。

2AssembliesShouldHaveValidStrongNames   CA2210

    程序集应该有强类型签名,强名称可避免客户端在不知情的情况下加载已被篡改的程序集。 除非极为有限的几种情况,否则不应部署没有强名称的程序集。

3AvoidEmptyInterfaces    CA1040

避免空的接口,如果设计中包含类型需要实现的空接口,可以将接口作为标记或者作为标识一组类型的手段使用。如果此标识在运行时出现,则实现这种应用的正确方式是使用自定义特性。通过是否使用特性,或使用特性的属性,可以标识目标类型。如果该标识必须在编译时出现,则使用空接口是可以接受的。 

4AvoidExcessiveParametersOnGenericTypes    CA1005

避免泛型类型的参数过多,两个是一个分界线,最好不要超过两个。

5AvoidNamespacesWithFewTypes    CA1020

   避免使用类型极少的命名空间,合理的归类命名空间可以提高代码的易维护及易读性。

6AvoidOutParameters   CA1021

   尽量避免使用out参数,但也要分情况。举例微软的try模式的方式

7CollectionsShouldImplementGenericInterface   CA1010

    集合应该实现泛型接口,常见的泛型接口为:            System.Collections.Generic.IEnumerable<T>

System.Collections.Generic.ICollection<T>

System.Collections.Generic.IList<T>

8ConsiderPassingBaseTypesAsParameters   CA1011

某方法声明包含一个派生类型的形参,且该方法仅调用该参数的基类型的成员的时候参数要定义成基类型,这样这个方法使用面会更广,任何这个基类的子类都可以当做实参传进来。

9DeclareEventHandlersCorrectly   CA1009  

正确声明事件处理程序,举一个自己写的小例子:

using System;
using System.Windows.Forms;
namespace TestFxCopRule
{
     public class AlarmEventArgs : EventArgs {
        public AlarmEventArgs(string myName, int myAge) {
            this.MyName = myName;
            this.MyAge = myAge;
    }
        private AlarmEventArgs()
        {}
        public string MyName;
        public int MyAge;
    }
   public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    public class MyEvent
    {
        public AlarmEventHandler DDD;
        public MyEvent()
        {
            DDD+= dd;
        }
        public void InvokeMyEvent()
        {
            if(DDD==null)
            {
                return;
            }
            AlarmEventArgs e=new AlarmEventArgs("Anders lu",28);
            DDD(this,e);
        }
        public void  dd (object sender, AlarmEventArgs e)
        {
            MyEvent mye=sender as MyEvent;
            MessageBox.Show(e.MyName+" Invoke MyEvent  in  "+ mye.GetType().ToString() );
        }
    }
}

DeclareTypesInNamespaces   CA1050 

应在命名空间内声明类型以避免名称冲突,并作为一种在对象层次结构中组织相关类型的方式。位于任何命名的命名空间之外的类型属于全局命名空间,全局命名空间无法在代码中引用。 

11DefaultParametersShouldNotBeUsed   CA1026

为了使.net代码应用面更广,建议不要使用默认参数,如果有这方便的需求可以采取提供默认参数的方法重载来替换使用默认参数的方法 

DefineAccessorsForAttributeArguments   CA1019

定义特性参数的访问器,请为每一个不具有只读属性的构造函数参数添加只读属性。 

DoNotCatchGeneralExceptionTypes  CA1031 

尽量不要捕捉一般性异常,要尽量具体话异常

DoNotDeclareProtectedMembersInSealedTypes CA1047 

不要在密封类型中声明受保护的成员,按照定义,不能从密封类型继承,意味着不能调用密封类型上受保护的方法。 

15DoNotDeclareStaticMembersOnGenericTypes  CA1000

不要在泛型类型中声明静态成员。

16DoNotDeclareVirtualMembersInSealedTypes CA1048

 不要在密封类型中声明虚拟成员,类型将方法声明为虚方法,使继承类型可以重写虚方法的实现。根据定义,不能从密封类型继承,这使得密封类型上的虚方法没有意义。 

17DoNotDeclareVisibleInstanceFields  CA1051

不要声明可见实例字段,字段的主要用途应是作为实现的详细信息。字段应为 private 或 internal,并应当通过使用属性来公开。访问属性和访问字段一样容易,且随着类型的功能扩展,无需引入间断更改即可更改属性的访问器中的代码。仅返回私有或内部字段值的属性经过优化,可以像访问字段那样执行;在属性上使用外部可见字段不太会提高性能。 

18DoNotExposeGenericLists  CA1002

不要公开泛型列表,System.Collections.Generic.List<T> 是针对性能(而非继承)设计的泛型集合。 System.Collections.Generic.List<T> 不包含更便于更改继承类的行为的虚拟成员。下面的泛型集合是针对继承功能设计的,应公开为 System.Collections.Generic.List<T> 以外的内容。

System.Collections.ObjectModel.Collection<T>

System.Collections.ObjectModel.ReadOnlyCollection<T>

System.Collections.ObjectModel.KeyedCollection<TKey, TItem>

19DoNotHideBaseClassMethods  CA1061

不要隐藏基类方法,如果派生方法的参数签名只是在类型方面有所不同,而且与基方法的参数签名中的对应类型相比,这些类型的派生方式更弱,则基类型中的方法将被派生类型中的同名方法隐藏。 

  20DoNotNestGenericTypesInMemberSignatures CA1006

不要将泛型类型嵌套在成员签名中,嵌套类型参数是一个类型参数,也是一个泛型类型。若要调用签名包含嵌套类型参数的成员,用户必须实例化一个泛型类型,并将此类型传递到另一个泛型类型的构造函数。所需的过程和语法很复杂,应当避免。 

21DoNotOverloadOperatorEqualsOnReferenceTypes  CA1046

不要对引用类型重载相等运算符,对于引用类型,相等运算符的默认实现几乎始终是正确的。默认情况下,仅当两个引用指向同一对象时,它们才相等。 

22DoNotPassTypesByReference   CA1045

不要通过引用来传递类型, 传递引用类型需要两个关键字out与ref,语法较难理解,如无特殊用途,不采取此语法。

23DoNotRaiseExceptionsInUnexpectedLocations  CA1065

不要在意外的位置引发异常,不应引发异常的方法可分为以下几类:

Property Get 方法;事件访问器方法;Equals 方法;GetHashCode 方法ToString 方法;静态构造函数;终结器;Dispose 方法;相等运算符;隐式转换运算符。

24EnumStorageShouldBeInt32 CA1028

枚举存储应为 Int32,使用示例如下:

 [Flags]

    public enum Days : int

    {

        None        = 0,

        Monday      = 1,

        Tuesday     = 2,

        Wednesday   = 4,

        Thursday    = 8,

        Friday      = 16,

        All         = Monday| Tuesday | Wednesday | Thursday | Friday

    }

EnumeratorsShouldBeStronglyTyped CA1038

枚举数应强类型化,此规则要求 IEnumerator 实现还提供 Current 属性的强类型版本,以使用户在使用该接口提供的功能时不必将返回值强制转换为强类型。该规则假定实现 IEnumerator 的类型包含强于 Object 的类型的实例集合。 

25EnumsShouldHaveZeroValue  CA1008

枚举后选址里必须包含零值,像其他值类型一样,未初始化枚举的默认值为零。无标志特性的枚举应定义值为零的成员,这样默认值即为该枚举的有效值。如果合适,将该成员命名为“None”。否则,将零赋给最常用的成员。请注意,默认情况下,如果声明中未设置第一个枚举成员的值,则其值为零。

如果应用了 FlagsAttribute 的枚举定义零值成员,则其名称应为“None”,以指示枚举中尚未设置值。出于任何其他目的使用零值成员都与使用 FlagsAttribute 的目的相背,因为 AND 和 OR 按位运算符对该成员无用。这意味着,只能为一个成员赋值零。请注意,如果应用了标志特性的枚举中发生多个零值的成员,则 Enum.ToString() 会为非零成员返回不正确结果。

26ExceptionsShouldBePublic CA1064

异常应该是公共的,内部异常仅在其自己的内部范围内可见。当异常超出内部范围后,只能使用基异常来捕获该异常。如果内部异常是从 ExceptionSystemException 或 ApplicationException继承的,外部代码将没有足够的信息了解如何处理该异常。 

27GenericMethodsShouldProvideTypeParameter CA1004

泛型方法应提供类型参数,下面的示例演示了调用两个泛型方法的语法。 InferredTypeArgument 的类型参数是推断出来的,而 NotInferredTypeArgument 的类型参数则必须是显式指定的。

using System;

namespace DesignLibrary

{

   public class Inference

   {

      // This method violates the rule.

      public void NotInferredTypeArgument<T>()

      {

         Console.WriteLine(typeof(T));

      }

      // This method satisfies the rule.

      public void InferredTypeArgument<T>(T sameAsTypeParameter)

      {

         Console.WriteLine(sameAsTypeParameter);

      }

   }

   class Test

   {

      static void Main()

      {

         Inference infer = new Inference();

         infer.NotInferredTypeArgument<int>();

         infer.InferredTypeArgument(3);

      }

   }

}

28ICollectionImplementationsHaveStronglyTypedMembers  CA1035

ICollection 实现含有强类型成员,此规则要求 ICollection 实现提供强类型成员,以使用户在使用该接口提供的功能时不必将参数强制转换成 Object 类型。该规则假定实现 ICollection 的类型执行此操作来管理强于 Object 的类型的实例集合。

ICollection 实现 System.Collections.IEnumerable 接口。如果集合中的对象扩展了 System.ValueType,则您必须为 GetEnumerator 提供一个强类型成员,以避免由装箱造成的性能下降。当集合的对象是引用类型时,这是不需要的。

要实现接口成员的强类型版本,请使用 InterfaceName.InterfaceMemberName 形式的名称(如 CopyTo)来显式实现接口成员。这些显式接口成员使用由该接口声明的数据类型。使用接口成员名称(如 CopyTo)来实现强类型成员。将强类型成员声明为公共的,将参数和返回值声明为由集合管理的强类型。这些强类型会替换由接口声明的较弱类型,例如 Object 和 Array

29ImplementIDisposableCorrectly  CA1063

正确实现 IDisposable

30ImplementStandardExceptionConstructors  CA1032

实现标准异常构造函数,异常类型必须实现下列构造函数:

公共 NewException()

公共 NewException(string)

公共 NewException(string, Exception)

受保护或私有的 NewException(SerializationInfo, StreamingContext)

如果不能提供完整的构造函数集,要正确处理异常将变得比较困难。例如,带有签名 NewException(string, Exception) 的构造函数用于创建由其他异常导致的异常。如果没有此构造函数,则无法创建和引发包含内部(嵌套)异常的自定义异常的实例,而在此类情况下托管代码应执行此操作。按照约定,前三个异常构造函数是公共的。第四个构造函数在未密封类中是受保护的,而在密封类中是私有的。

31IndexersShouldNotBeMultidimensional  CA1023

索引器不应是多维的,索引器(即索引属性)应该使用一个索引。多维索引器会大大降低库的可用性。如果设计需要使用多个索引,请重新考虑类型是否代表逻辑数据存储。否则,请使用方法。

32InterfaceMethodsShouldBeCallableByChildTypes  CA1033

接口方法应可由子类型调用,请考虑显式实现公共接口方法的基类型。从该基类型派生的类型只能通过对被强制转换为接口的当前实例(C# 中的 this)的引用来访问继承的接口方法。如果派生的类型重新实现(显式)继承的接口方法,则无法再访问基实现。通过当前实例引用进行的调用将调用派生的实现;这会导致递归调用,并最终导致堆栈溢出。 

33ListsAreStronglyTyped  CA1039

列表提供强类型成员,此规则要求 IList 实现提供强类型成员,以使用户在使用该接口提供的功能时不必将参数强制转换成 System.Object 类型。 IList 接口由可以通过索引访问的对象集合实现。该规则假定实现 IList 的类型这样做以管理类型比 Object 更强的实例的集合。 

34MarkAssembliesWithAssemblyVersion   CA1016 

用 AssemblyVersionAttribute 标记程序集

35MarkAssembliesWithClsCompliant CA1014

用 CLSCompliantAttribute 标记程序集

36MarkAssembliesWithComVisible  CA1017 

ComVisibleAttribute 特性决定 COM 客户端如何访问托管代码。合理的设计指出程序集将显式指示 COM 可见性。可以设置整个程序集的 COM 可见性,然后重写各个类型和类型成员的 COM 可见性。如果该特性不存在,则该程序集的内容对 COM 客户端可见。 

37MarkAttributesWithAttributeUsage CA1018 

可通过在特性类上放置 AttributeUsageAttribute 来控制特性类的使用方式。

38MarkEnumsWithFlags  CA1027

Flage特性标记枚举。

39MembersShouldNotExposeCertainConcreteTypes CA1059

 成员不应公开某些具体类型

40MovePInvokesToNativeMethodsClass  CA1060

将 P/Invoke 移动到 NativeMethods 

41NestedTypesShouldNotBeVisible  CA1034

      嵌套类型是在另一个类型的范围中声明的类型。  嵌套类型用于封装包含类型的私有实现详细信息。  如果用于此用途,则嵌套类型不应是外部可见的。

42OverloadOperatorEqualsOnOverloadingAddAndSubtract CA1013

    重载加法方法和减法方法时重载相等运算符

43OverrideMethodsOnComparableTypes  CA1036

     重写可比较类型中的方法定义自定义排序顺序的类型实现 IComparable 接口。  CompareTo 方法返回一个整数值,指示该类型的两个实例的正确排序顺序。  该值标识设置排序顺序的类型;这意味着不会应用相等、不等、小于或大于的常规含义。  提供 IComparable 的实现时,通常还必须重写 Equals,以使其返回与 CompareTo 一致的值。  如果重写 Equals 并使用支持运算符重载的语言编写代码,则还应提供与 Equals 一致的运算符。 

44PropertiesShouldNotBeWriteOnly  CA1044

     get 访问器提供对属性的读访问,而 set 访问器提供写访问。  虽然可以接受且经常需要使用只读属性,但设计准则禁止使用只写属性。  这是因为允许用户设置值但又禁止该用户查看这个值不能提供任何安全性。  而且,如果没有读访问,将无法查看共享对象的状态,使其用处受到限制。 

45ProvideObsoleteAttributeMessage  CA1041

    提供 ObsoleteAttribute 消息ObsoleteAttribute 用于标记被否决的库类型和成员。  库使用者应避免使用任何标记为已过时的类型或成员。  这是因为它可能不被支持,并将最终将从库的更高版本中被删除。  当编译用 ObsoleteAttribute 标记的类型或成员时,将显示特性的 Message 属性。  这将为用户提供有关已过时的类型或成员的信息。  该信息通常包括库设计器还将支持已过时类型或成员的时间长度,以及首选的替代类型或成员。 

46ReplaceRepetitiveArgumentsWithParamsArray  CA1025

用形参数组替换重复的实参公共类型中的某个公共或受保护方法具有三个以上的参数,且其后三个参数为相同类型

47StaticHolderTypesShouldBeSealed  CA1052

该规则假定只包含静态成员的类型没有设计为能被继承,因为该类型不提供可以在派生类型中重写的任何功能。  不希望被继承的类型应使用 sealed 修饰符禁止将其用作基类型。 

48StringUriOverloadsCallSystemUriOverloads  CA1057

   字符串 URI 重载调用 System.Uri 重载

49TypesShouldNotExtendCertainBaseTypes  CA1058

类型不应扩展某些基类型外部可见的类型扩展某些基类型。  目前,此规则报告从下列类型派生的类型: 

System.ApplicationException 

System.Xml.XmlDocument 

System.Collections.CollectionBase 

System.Collections.DictionaryBase 

System.Collections.Queue 

System.Collections.ReadOnlyCollectionBase 

System.Collections.SortedList 

System.Collections.Stack 

50TypesThatOwnDisposableFieldsShouldBeDisposable    CA1001

     具有可释放字段的类型应该是可释放的

51TypesThatOwnNativeResourcesShouldBeDisposable  CA1049

    拥有本机资源的类型应是可释放的

52UriParametersShouldNotBeStrings   CA1054

    URI 参数不应为字符串

53UriPropertiesShouldNotBeStrings  CA1056 

  URI属性不应为字符串

54UriReturnValuesShouldNotBeStrings  CA1055

 URI返回值不应为字符串

55UseEventsWhereAppropriate  CA1030

  在适当的时机下使用事件, 该规则检测名称通常用于事件的方法。  事件遵循观察者发布-订阅设计模式;当需要与其他对象交流一个对象的状态更改时使用这些事件。  如果为响应明确定义的状态更改而调用一个方法,则应由事件处理程序调用该方法。  调用该方法的对象应引发事件而不是直接调用该方法。 

在单击按钮等用户操作会导致执行一段代码的用户界面应用程序中,可以找到事件的某些常见示例。  .NET Framework 事件模型不限于用户界面;可以在必须与一个或多个对象交流状态更改的任意位置使用它。 

56UseGenericEventHandlerInstances  CA1003 

使用通用的事件Handler

57UseGenericsWhereAppropriate  CA1007 

     在适当时机使用泛型。引用参数是用 ref(在 Visual Basic 中为 ByRef)关键字修饰的参数。为引用参数提供的参数类型必须与引用参数类型完全匹配。若要使用从引用参数类型派生的类型,必须首先对该类型进行强制转换,然后将该类型分配给引用参数类型的变量。使用泛型方法使受约束的所有类型都可以传递给方法,而无需先将类型强制转换为引用参数类型。

58UseIntegralOrStringArgumentForIndexers  CA1043

将整型或字符串参数用于索引器  索引器(即索引属性),应将整型或字符串类型用于索引。这些类型一般用于为数据结构创建索引和提高库的可用性。Object 类型的使用应仅限于不能在设计时指定特定整型或字符串类型的那些情况。如果设计需要对索引使用其他类型,请重新考虑该类型是否代表逻辑数据存储区。如果该类型不代表逻辑数据存储区,请使用方法。

59UsePropertiesWhereAppropriate CA1024

 在适当的时机使用属性,在大多数情况下,属性代表数据,而方法执行操作。  访问属性的方式与访问字段的方式相似,因此使用它们更容易。  如果存在下列条件之一,方法就很适于成为属性: 

不采用任何参数并返回对象的状态信息

接受单个参数来设置对象的部分状态

属性的表现应当与字段一样;如果该方法不是这样,则不应将其更改为属性。  在下列情况下,方法比属性更好 

方法执行耗时的操作。  与设置或获取字段值所需的时间相比,此方法的速度明显较慢

方法执行转换。  访问字段不会返回它所存储的数据的转换版本

Get 方法会产生明显副作用。  检索字段的值不会产生任何副作用 

执行的顺序很重要。  设置字段的值并不依赖于其他操作的发生 

连续调用两次方法会产生不同的结果

方法是静态的,但返回了调用方可更改的对象。  调用方不能通过检索某字段的值来更改该字段存储的数据

方法返回数组

Globalizationrules(区域性规则)

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,通常可以提高代码的速度、正确性和可靠性。

Interoperabilityrules(互操作性规则)

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、由于暂时公司开发涉及不到这块,先不翻译................................

Mobilityrules(流动性规则)

1DoNotUseIdleProcessPriority   CA1600

不要将进程优先级设置为 Idle。具有 System.Diagnostics.ProcessPriorityClass.Idle 优先级的进程将在 CPU 本应处于空闲状态时占用它,从而阻止进入待机状态。 

2、DoNotUseTimersThatPreventPowerStateChanges  CA1601

不要以高于每秒一次的频率进行轮询或使用触发频率高于每秒一次的计时器。频率较高的定期活动会使 CPU 处于繁忙状态,并且会干扰具有节能功能(关闭显示器和硬盘)的空闲计时器。 

Namingrules(命名规则)

1、CompoundWordsShouldBeCasedCorrectly   CA1702 

标识符的名称根据大小写被拆分成几个单词。每两个连续的单词组合由 Microsoft 拼写检查器库进行检查。如果它被识别,该标识符将生成规则冲突。导致冲突的复合词示例包括CheckSumMultiPart,它们的大小写分别应为ChecksumMultipart。由于以前经常使用,规则中置入了一些特例,一些单个的词也会被标记,例如ToolbarFilename,应按照大小写规则将它们视为两个不同的单词(即ToolBarFileName)。命名约定为所有针对公共语言运行时的库提供了通用的外观。

2、DoNotNameEnumValuesReserved  CA1700

此规则假定当前不使用名称中包含reserved的枚举成员,而是将其作为一个占位符,以在将来的版本中重命名或移除它。重命名或移除成员是一项重大更改。您不应指望用户只因为成员名称包含reserved就会忽略该成员,也不能依赖用户阅读或遵守文档。而且,因为保留成员既出现在对象浏览器中也出现在智能集成开发环境中,它们可能对实际使用了哪个成员造成混淆。

在将来的版本中将不使用保留成员,而是向枚举添加新成员。在大多数情况下,只要添加新成员不会引起原始成员的值更改,添加新成员就不是重大更改。

在有限的几种情况下,即使原始成员保留其原始值,添加成员也属于重大更改。主要原因是,新成员在从现有代码路径返回时,必须中断对包含整个成员列表并在默认情况下引发异常的返回值使用 switch(在 Visual Basic 中为 Select)语句的调用方。其次,客户端代码可能不处理反射方法的行为的更改,如 Enum.IsDefined。因此,如果要从现有的方法返回具有新的成员,或者由于使用较差的反射而发生已知的应用程序不兼容,则唯一的无间断解决方法是:

添加一个新的枚举,其中包含原始成员和新成员。用 System.ObsoleteAttribute 特性标记原始枚举。

对任何外部可见并公开原始枚举的类型或成员均执行相同的过程。

3、DoNotPrefixEnumValuesWithTypeName   CA1712

不要将类型名用作枚举值的前缀枚举成员的名称不能以类型名称作为前缀,因为类型信息将由开发工具提供。命名约定为所有针对公共语言运行时的库提供了通用的外观。

4、EventsShouldNotHaveBeforeOrAfterPrefix  CA1713

事件不应具有 before 或 after 前缀事件名称应当说明引发事件的操作。若要命名按特定顺序引发的相关事件,请使用现在时或过去时指示一系列操作中的相对位置。例如,当命名关闭资源时引发的一对事件时,可以将其命名为ClosingClosed,而不是BeforeCloseAfterClose 

5、FlagsEnumsShouldHavePluralNames    CA1714

  Flags 枚举应采用复数形式的名称标有 FlagsAttribute 的类型具有复数形式的名称,因为该特性指明可以指定多个值。例如,定义星期几的枚举可能打算在可以指定多天的应用程序中使用。此枚举应具有FlagsAttribute 并且可称为Days。只允许指定一天的类似枚举将没有该特性,并可称为Day 

6、IdentifiersShouldBeCasedCorrectly  CA1709 

标识符的大小写应当正确命名约定为所有针对公共语言运行时的库提供了通用的外观。

按照约定,参数名使用 Camel 大小写;命名空间、类型和成员名称使用 Pascal 大小写。在采用 Camel 大小写格式的名称中,第一个字母为小写,名称中其他所有单词的第一个字母为大写。Camel 大小写形式的名称示例为packetSnifferioFilefatalErrorCode。在采用 Pascal 大小写格式的名称中,第一个字母为大写,名称中其他所有单词的第一个字母为大写。Pascal 大小写形式的名称示例为PacketSnifferIOFileFatalErrorCode

该规则根据大小写将名称拆分为若干单词,并依据常见的双字母单词(例如InMy)列表来检查所有双字母单词。如果未找到匹配项,则假定该单词是首字母缩略词。此外,此规则假定发现一个首字母缩略词,其名称在一行中包含四个大写字母,或在名称的结尾发现一行中有三个大写字母。

按照约定,双字母的首字母缩略词全部使用大写字母,含三个或三个以上字符的首字母缩略词则使用 Pascal 大小写形式。下面的示例使用该命名约定:DBCRCpaEcma。下面的示例与该约定冲突:IoXMLDoD;对于非参数名称,冲突的示例有xpcpl

ID是一种导致与该规则冲突的特殊情况。'Id不是首字母缩略词,而是identification的缩写。

7、IdentifiersShouldBeSpelledCorrectly  CA1704 

    标识符应正确拼写此规则将标识符解析为标记并检查每个标记的拼写。解析算法执行下列转换:

一个新标记以大写字母开头。例如,MyNameIsJoe 被解析为MyNameIsJoe标记。

对于多个大写字母,最后一个大写字母开始一个新标记。例如,GUIEditor 被解析为GUIEditor标记。

移除前导和尾随撇号。例如,'sender'被解析为sender标记。

下划线表示一个标记的结尾,并被移除。例如,Hello_world 被解析为Helloworld标记。

嵌入的与号将被移除。例如,for&mat 被解析为format标记。

默认情况下,使用拼写检查器的英语 (en) 版本。目前没有其他语言字典。

8、IdentifiersShouldDifferByMoreThanCase  CA1708

标识符不应仅以大小写进行区分不能仅通过大小写区分命名空间、类型、成员和参数的标识符,因为针对公共语言运行时的语言不需要区分大小写。

9、IdentifiersShouldHaveCorrectPrefix CA1715 

  标识符应具有正确的前缀按照约定,某些编程元素的名称以特定前缀开头。

接口名称应以大写字母I开头,后跟另一个大写字母。泛型类型参数名称应以大写字母T开头,后面可跟另一个大写字母。

10IdentifiersShouldHaveCorrectSuffix  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

Hasnt

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

Performancerules(性能规则)

1、AvoidExcessiveLocals   CA1809

     避免过多的局部变量,优化性能的常见方法是将值存储于处理器寄存器,而不是内存中,这称为注册值。公共语言运行时最多可考虑注册 64 个局部变量。未注册的变量放在堆栈中,必须移到寄存器内方能进行操作。若要提供所有的局部变量都能注册的机会,应将局部变量的数目限制在 64 个以内。 

2、AvoidUncalledPrivateCode  CA1811

避免使用未调用的私有代码。

3、AvoidUninstantiatedInternalClasses   CA1812

避免未实例化的内部类

4、AvoidUnsealedAttributes    CA1813

避免使用未密封的特性

5、DoNotCastUnnecessarily   CA1800

避免进行不必要的强制转换,重复强制转换会降低性能,特别是在精简的迭代语句中执行强制转换时。对于显式重复强制转换操作,将强制转换的结果存储在局部变量中,并使用局部变量来替代重复强制转换操作。 

6、InitializeReferenceTypeStaticFieldsInline  CA1810

以内联方式初始化引用类型的静态字段,当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型的每个静态方法和实例构造函数中添加一项检查,以确保之前已调用该静态构造函数。访问任何静态成员或创建了类型实例时,都会触发静态初始化。示例用法:

public class NoStaticConstructor   {      static int someInteger = 3;      static string resourceString = InitializeResourceString();      static string InitializeResourceString()      {         ResourceManager stringManager =             new ResourceManager("strings", Assembly.GetExecutingAssembly());         return stringManager.GetString("string");      }   }

7、MarkAssembliesWithNeutralResourcesLanguage  CA1824 

用 NeutralResourcesLanguageAttribute 标记程序集

8、MarkMembersAsStatic CA1822

将成员标记为 static可以将不访问实例数据或不调用实例方法的成员标记为 static(在 Visual Basic 中为 Shared)。在将这些方法标记为 static 之后,编译器将向这些成员发出非虚拟调用站点。发出非虚拟调用站点将禁止在运行时对每个调用进行检查,从而确保当前的对象指针为非空。这会使性能敏感的代码的性能得到显著提高。在某些情况下,如果无法访问当前的对象实例,则表示存在正确性问题。

9、OverrideEqualsAndOperatorEqualsOnValueTypes  CA1815

重写值类型上的 Equals 和相等运算符。对于值类型,Equals 的继承的实现使用反射库,并比较所有字段的内容。反射需要消耗大量计算资源,可能没有必要比较每一个字段是否相等。如果希望用户对实例进行比较或排序,或者希望用户将其作为哈希表键,则值类型必须实现 Equals。如果编程语言支持运算符重载,则还应提供等号和不等号运算符的实现。

10、PreferJaggedArraysOverMultidimensional  CA1814

与多维数组相比,首选使用交错的数组,交错数组是元素为数组的数组。构成元素的数组可以是不同的大小,以减少某些数据集的浪费空间。

11、 PropertiesShouldNotReturnArrays  CA1819 

属性不应返回数组,即使属性是只读的,该属性返回的数组也不是写保护的。若要使数组不会被更改,属性必须返回数组的副本

12、 RemoveEmptyFinalizers   CA1821

 应尽可能避免析构函数,因为跟踪对象生存期会产生额外的性能系统开销。垃圾收集器将在收集该对象之前运行析构函数。这意味着收集该对象需要两个集合。空的终结器只会徒增这种系统开销,而没有一点好处。如果进行调试时需要一个终结器,请将整个终结器括在 #if DEBUG / #endif 指令中。

13、RemoveUnusedLocals   CA1804

移除未使用的局部变量

14、TestForEmptyStringsUsingStringLength   CA1820

   使用字符串长度测试是否有空字符串使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串要比使用 Equals 的速度快得多。这是因为与 IsNullOrEmpty 或者为检索 Length 属性值并将其与零比较所需执行的指令数相比,Equals 执行更多的 MSIL 指令。

15、UseLiteralsWhereAppropriate   CA1802

在合适的位置使用文本在调用声明类型的静态构造函数时,会在运行时计算 staticreadonly 字段的值。如果在声明 staticreadonly 字段时未对其进行初始化,而且未显式声明静态构造函数,则编译器会发出一个静态构造函数来初始化该字段。const 字段的值在编译时计算并将存储在元数据库中,与 staticreadonly 字段相比,这有助于提高运行时性能。因为赋给目标字段的值可在编译时计算,所以,请将声明更改为 const 字段,以便该值在编译时(而非运行时)计算。

Portabilityrules(可移植性规则)

1、PInvokeDeclarationsShouldBePortable   CA1901

P/Invoke 声明应为可移植声明,可通过使用 IntPtr 或 UIntPtr(而非 Int32 或 UInt32)表示句柄来修复此冲突。

2UseOnlyApiFromTargetedFramework   CA1903 

 仅使用目标框架中的 API

3、ValueTypeFieldsShouldBePortable  CA1900 

值类型字段应为可移植字段,当用显式布局声明的结构封送到 64 位操作系统上的非托管代码时,是否正确对齐。IA-64 不允许访问未对齐的内存,如果此冲突未得到修复,进程将崩溃。

Securityrule(安全性规则)

1、AptcaMethodsShouldOnlyCallAptcaMethods  CA2116

APTCA 方法应只调用 APTCA 方法

2、AptcaTypesShouldOnlyExtendAptcaBaseTypes CA2117

APTCA 类型应只扩展 APTCA 基类型

3、ArrayFieldsShouldNotBeReadOnly  CA2105

数组字段不应为只读,设置了也不启作用。

4、CallGCKeepAliveWhenUsingNativeResources CA2115

处理 Exception 的 catch 块会捕获所有符合公共语言规范 (CLS) 的异常。但是,它不捕获不符合 CLS 的异常。

 try{ThrowsExceptions.ThrowNonClsException();}         

catch(Exception e) {// Remove some permission.

Console.WriteLine("CLS compliant exception caught"); }        

 catch{// Remove the same permission as above.            Console.WriteLine("Non-CLS compliant exception caught."); }

5、DoNotDeclareReadOnlyMutableReferenceTypes  CA2104

不要声明只读可变引用类型,举例:static protected readonly StringBuilder SomeStringBuilder;

6、DoNotIndirectlyExposeMethodsWithLinkDemands  CA2122 

     不要使用链接请求间接公开方法,

7、MethodSecurityShouldBeASupersetOfType CA2114 

方法安全性应是类型安全性的超集,

8、安全性规则后续规则虑过,因为个人愚见,自己团队暂时用不到。

 Securitytransparencyrules(安全透明性规则) 

1、DefaultConstructorsMustHaveConsistentTransparencyFxCopRule  CA2132

默认构造函数必须至少与基类型默认构造函数具有同样的关键性,具有 SecurityCriticalAttribute 的类型和成员无法供 Silverlight 应用程序代码使用。安全关键类型和成员只能供 .NET Framework for Silverlight 类库中的受信任代码使用。

2、DelegatesMustBindWithConsistentTransparencyFxCopRule  CA2133

 委托类型及其绑定的方法必须有一致的透明度。透明和安全关键委托可能仅绑定到其他透明或关键安全方法。相似地,关键委托可能仅将绑定到关键的方法。这些绑定规则确保通过委托调用方法的唯一代码也已直接调用相同方法。例如,绑定规则阻止透明代码直接通过透明委托调用关键代码。

3、省略若干项安全透明性规则,因为个人愚见,自己团队暂时用不到。

Usagerules(引用规则)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值