FxCop性能规则
五、 Performance(性能规则)
1. Avoid calls that require unboxing
避免调用一个方法,它返回object类型,而你需要的是一个值类型(需要对返回值进行拆箱操作)
2. Avoid costly calls where possible
尽可能的避免进行代价高昂的调用
3. Avoid excessive locals
避免使用过多的局部变量(多于64个,部分可能是编译器生成的)
4. Avoid uncalled private code
避免声明在程序集内从来未被调用的私有成员(private和internal),以下除外:
? 明确的接口成员
? 静态构造方法
? 静态的Main方法(不含参数或仅包含一个string数组的参数的)
? 序列化构造方法
? 标记有System.Runtime.InteropServices.ComRegisterFunctionAttribute或者 System.Runtime.InteropServices.ComUnregisterFunctionAttribute.特性的
? 重写的方法
5. Avoid uninstantiated internal classes
避免声明不会被实例化的内部类,以下情况除外
? 值类型
? 抽象类型
? 枚举
? 委托
? 编译器生成的数组类型
? 仅含有静态成员的内部类
6. Avoid unnecessary string creation
避免创建不必要的string实例(犹指‘通过ToLower和ToUpper创建的string’),含以下情况
? 对于同一个string实例多次调用ToLower和ToUpper(建议:将返回值赋给一个局部变量,然后使用此局部变量)
? 使用equals,’==‘,!=比较‘通过ToLower和ToUpper创建的string’(建议:使用String.Compare比较)
? 向一个System.Collections.Specialized.HybridDictionary类型的成员传递‘通过ToLower和ToUpper创建的string’(建议:HybridDictionary具有一个指示是否忽略大小写的参数的构造方法重载,使用此重载并传递一个true值进去)
7. Avoid unsealed attributes
避免声明未封闭的特性(attributes)(建议:声明为sealed/ NotInheritable-vb.net或者abstract)
8. Avoid unused parameters
避免在方法声明中包含不会被使用的参数,以下情况除外
? 代理引用的方法
? 作为事件处理程序的方法
? 抽象方法(abstract)
? 虚方法(virtual)
? 重写的方法(override)
? 外部方法(extern)
9. Dispose methods should call SuppressFinalize
Dispose方法应该调用SuppressFinalize,以请求系统不要调用其Finalize方法
10. Do not call properties that clone values in loops
不要在循环中使用‘返回一个Clone的对象的属性’(每次返回‘引用不同’的对象,会导致创建大量的相同的对象)
11. Do not cast unnecessarily
不要进行不必要的类型转换(特别是尝试性的转换,建议:在转换前可以使用is操作符来判断转换能够成功)
12. Do not concatenate strings inside loops
不要在循环内串联string(建议:使用StringBuilder代替string)
13. Do not ignore method results
不要忽略方法的返回值(通常调用string的方法会返回新的string)
14. Do not initialize unnecessarily
不要进行不必要的初始化(比如将类成员初始化为它的默认值)
15. Initialize reference type static fields inline
在静态成员声明的时候直接初始化或者调用静态方法初始化(不要使用静态构造方法来初始化静态成员,静态构造方法会影响性能),以下情况除外:
? 初始化对全局状态的影响是代价高昂的,而且类型在使用前不需要进行初始化的
? 在不需要访问该类型的静态成员的情况下,全局状态的影响就可以被访问到的
16. Override equals and operator equals on value types
对于公有的值类型,重写equals方法和’==‘操作符(如果你期望用户对实例进行比较或者排序,或者作为哈希表的键)
17. Prefer jagged arrays over multidimensional
使用锯齿形数组代替多维数组(当数组各元素的长度可能不一致时)
注意:公共语言规范(CLS)不支持锯齿数组
18. Properties should not return arrays
公有类型的属性不应该返回数组(数组类型的属性无法进行写保护,即使是只读的,除非每次返回不同的拷贝,但是这样会让调用者产生迷惑。建议:改成方法)
19. Remove empty finalizers
移除空的终结器
20. Remove unused locals
移除未使用过的局部变量
21. Test for empty strings using string length
使用length属性测试字符串是否为空(原因:不要使用==””、==String..Empty、Equals(“”)等方法,使用Length属性的效率是最高的;null==empty比较不会抛出异常;在DotNetFrameWork2里面可以使用IsNullOrEmpty方法来判断字符串是否为null或者empty)
22. Use literals where appropriate
在适当的时候使用const代替static readonly(const是编译时赋值的)