性能规则支持高性能库和应用程序。
在本节中
规则
描述
CA1802:在合适的位置使用文本
某个字段被声明为 static 和 read-only(在 Visual Basic 中为 Shared 和 ReadOnly),并使用可在编译时计算的值初始化。 因为赋给目标字段的值可在编译时计算,因此请将声明更改为 const(在 Visual Basic 中为 Const)字段,以便在编译时而非运行时计算值。
CA1805:避免进行不必要的初始化
在运行构造函数之前,.NET 运行时将引用类型的所有字段初始化为其默认值。 在大多数情况下,将字段显式初始化为其默认值是多余的,这会增加维护成本,并可能会降低性能(例如随着程序集大小的增加)。
CA1806:不要忽略方法结果
创建一个新对象,但从不使用该对象;或者调用会创建并返回一个新字符串的方法,但从不使用这个新字符串;或者组件对象模型 (COM) 或 P/Invoke 方法返回一个从不使用的 HRESULT 或错误代码。
CA1810:以内联方式初始化引用类型的静态字段
当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型的每个静态方法和实例构造函数中添加一项检查,以确保之前已调用该静态构造函数。 静态构造函数检查会降低性能。
CA1812:避免未实例化的内部类
程序集级别类型的实例不是由程序集中的代码创建的。
CA1813:避免使用非密封特性
.NET 提供用于检索自定义属性的方法。 默认情况下,这些方法搜索特性继承层次结构。 通过密封特性,将无需搜索继承层次结构,且能够提高性能。
CA1814:与多维数组相比,首选使用交错数组
交错数组是元素为数组的数组。 构成元素的数组可采用不同的大小,使某些数据集浪费的空间减少。
CA1815:重写值类型上的 Equals 和相等运算符
对于值类型,Equals 的继承的实现使用反射库,并比较所有字段的内容。 反射需要消耗大量计算资源,可能没有必要比较每一个字段是否相等。 如果希望用户对实例进行比较或排序,或者希望用户将实例用作哈希表键,则值类型应实现 Equals。
CA1819:属性不应返回数组
即使属性是只读的,该属性返回的数组也不受写入保护。 若要使数组不会被更改,属性必须返回数组的副本。 通常,用户不能理解调用这种属性的负面性能影响。
CA1820:使用字符串长度测试是否有空字符串
使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串要比使用 Equals 的速度快得多。
CA1821:移除空终结器
应尽可能避免终结器,因为跟踪对象生存期会产生额外的性能系统开销。 空的终结器只会徒增开销,没有一点好处。
CA1822:将成员标记为 static
可以将不访问实例数据或不调用实例方法的成员标记为 static(在 Visual Basic 中为 Shared)。 在将这些方法标记为 static 之后,编译器将向这些成员发出非虚拟调用站点。 这会使性能敏感的代码的性能得到显著提高。
CA1823:避免未使用的私有字段
检测到程序集内有似乎未访问过的私有字段。
CA1824:用 NeutralResourcesLanguageAttribute 标记程序集
NeutralResourcesLanguage 属性通知资源管理器用于显示程序集的非特定区域性资源的语言。 这将改进所加载的第一个资源的查找性能,并缩小工作集。
CA1825:避免数组分配长度为零
初始化长度为零的数组将导致不必要的内存分配。 相反,请通过调用 Array.Empty 来使用静态分配的空数组实例。 内存分配在此方法的所有调用之间共享。
CA1826:使用属性,而不是 Linq Enumerable 方法
对支持等效且更有效的属性的类型使用了 Enumerable LINQ 方法。
CA1827:如果可以使用 Any,请勿使用 Count/LongCount
在使用 Any 方法会更有效的情况下使用了 Count 或 LongCount 方法。
CA1828:如果可以使用 AnyAsync,请勿使用 CountAsync/LongCountAsync
在使用 AnyAsync 方法会更有效的情况下使用了 CountAsync 或 LongCountAsync 方法。
CA1829:使用 Length/Count 属性,而不是 Enumerable.Count 方法
对支持等效且更有效的 Length 或 Count 属性的类型使用了 Count LINQ 方法。
CA1830:在 StringBuilder 上优先使用强类型“追加和插入”方法重载
Append 和 Insert 为除 System.String 之外的多种类型提供重载。 如果可能,首选强类型重载,而非 ToString () 和基于字符串的重载。
CA1831:在合适的情况下,为字符串使用 AsSpan 而不是基于范围的索引器
对字符串使用范围索引器并向 ReadOnlySpan<char> 类型隐式赋值时,将使用方法 Substring 而非 Slice,这会生成字符串请求部分的副本。
CA1832:使用 AsSpan 或 AsMemory 而不是基于范围的索引器来获取数组的 ReadOnlySpan 或 ReadOnlyMemory 部分
对字符串使用范围索引器并向 ReadOnlySpan<T> 或 ReadOnlyMemory<T> 类型隐式赋值时,将使用方法 GetSubArray 而非 Slice,这会生成数组请求部分的副本。
CA1833:使用 AsSpan 或 AsMemory 而不是基于范围的索引器来获取数组的 Span 或 Memory 部分
对字符串使用范围索引器并向 Span<T> 或 Memory<T> 类型隐式赋值时,将使用方法 GetSubArray 而非 Slice,这会生成数组请求部分的副本。
CA1834:对单字符字符串使用 StringBuilder.Append(char)
StringBuilder 具有将 char 用作其参数的 Append 重载。 优先选择调用 char 重载以提高性能。
CA1835:对于“ReadAsync”和“WriteAsync”,首选基于“Memory”的重载
“Stream”有一个将“Memory<byte>”用作第一个参数的“ReadAsync”重载和一个将“ReadOnlyMemory<Byte>”用作第一个参数的“WriteAsync”重载。 优先选择调用基于内存的重载,它们更有效。
CA1836:如可用,首选 而不是 Count
首选比 Count、Length、Count<TSource>(IEnumerable<TSource>) 或 LongCount<TSource>(IEnumerable<TSource>) 更有效的 IsEmpty 属性,以确定对象是否包含任何项目。
CA1837:使用 而不是 Process.GetCurrentProcess().Id
Environment.ProcessId 比 Process.GetCurrentProcess().Id 更简单、更快速。
CA1838:避免对 P/Invokes 使用 参数
StringBuilder 的封送处理总是会创建一个本机缓冲区副本,这会导致一个封送处理操作出现多次分配。
CA1839:使用 Environment.ProcessPath 而不是 Process.GetCurrentProcess().MainModule.FileName
Environment.ProcessPath 比 Process.GetCurrentProcess().MainModule.FileName 更简单、更快速。
CA1840:使用 Environment.CurrentManagedThreadId 而不是 Thread.CurrentThread.ManagedThreadId
Environment.CurrentManagedThreadId 比 Thread.CurrentThread.ManagedThreadId 更紧凑、更高效。
CA1841:首选字典包含方法
对 Keys 或 Values 集合调用 Contains 通常比对字典本身调用 ContainsKey 或 ContainsValue 开销更高。
CA1842:不要对单个任务使用 "System.threading.tasks.task.whenall"
使用 WhenAll 单个任务可能会导致性能下降。 请等待或返回该任务。
CA1843:不要对单个任务使用 "WaitAll"
使用 WaitAll 单个任务可能会导致性能下降。 请等待或返回该任务。
CA1844:对“流”进行子分类时,提供异步方法的基于内存的重写
若要提高性能,请在对“流”进行子分类时重写基于内存的异步方法。 然后,在基于内存的方法中实现基于数组的方法。
CA1845:使用基于跨度的“string.Concat”
使用 AsSpan 和 string.Concat 比使用 Substring 和串联运算符更高效。
CA1846:首选 ,次选 Substring
AsSpan 比 Substring 更高效。 Substring 执行 O(n) 字符串复制,而 AsSpan 不会执行此操作且具有固定成本。 AsSpan 也不执行任何堆分配。
CA1847:对单个字符查找使用 char 文本
搜索单个字符时使用 string.Contains(char) 而不是 string.Contains(string)。
CA1848:使用 LoggerMessage 委托
为了提高性能,请使用 LoggerMessage 委托。
CA1849:当在异步方法中时,调用异步方法
在已属于异步的方法中,对其他方法的调用应指向其存在的异步版本。
CA1850:首选静态 方法,而非 ComputeHash
相比创建并管理 HashAlgorithm 实例来调用 ComputeHash,使用静态 HashData 方法更高效。