可靠性规则

支持库和应用程序可靠性(例如正确使用内存和线程)的可靠性规则。 可靠性规则包括:

规则 描述
CA2000:丢失范围之前释放对象 由于可能发生异常事件,导致对象的终结器无法运行,因此,应显式释放对象,以避免对该对象的所有引用超出范围。
CA2002:不要锁定具有弱标识的对象 当可以跨应用程序域边界直接进行访问对象时,则认为该对象具有弱标识。 对于尝试获取对具有弱标识的对象的锁的线程,该线程可能会被其他应用程序域中持有对同一对象的锁的另一线程所阻止。
CA2007:不直接等待任务 异步方法会直接等待Task
CA2008:不要在未传递 TaskScheduler 的情况下创建任务 任务创建或延续操作使用未指定 TaskScheduler 参数的方法重载。
CA2009:请勿对 ImmutableCollection 值调用 ToImmutableCollection 没有必要在 System.Collections.Immutable 命名空间的不可变集合上调用 ToImmutable 方法。
CA2011:请勿在其资源库中分配属性 属性在自身的 set 访问器中被意外赋值。
CA2012:正确使用 ValueTask 从成员调用中返回的 ValueTasks 旨在直接等待。 多次尝试使用 ValueTask 或在已知完成之前直接访问其结果可能会导致异常或损坏。 忽略此类 ValueTask 可能指示出现功能 Bug,还可能降低性能。
CA2013:请勿将 ReferenceEquals 与值类型结合使用 使用 System.Object.ReferenceEquals 比较值时,如果 objA 和 objB 是值类型,则在将其传递给 ReferenceEquals 方法之前将它们装箱。 这意味着,即使 objA 和 objB 都表示值类型的同一个实例,ReferenceEquals 方法也会返回 false。
CA2014:请勿在循环中使用 stackalloc。 仅在当前方法调用结束时,Stackalloc 分配的堆栈空间才会释放。 在循环中使用此方法可能导致无限堆栈增长,最终出现堆栈溢出的情况。
CA2015:请勿为派生自 MemoryManager<T> 的类型定义终结器 将终结器添加到派生自 MemoryManager<T> 的类型可能使内存在仍被 Span<T> 使用时得到释放。
CA2016:将 CancellationToken 参数转发到采用一个该参数的方法 CancellationToken 参数转发给方法来确保操作取消通知得到正确传播,或者在 CancellationToken.None 中显式传递,以指示有意不传播令牌。
CA2017:参数计数不匹配 日志记录消息模板中所提供参数的数量与已命名占位符的数量不匹配。
CA2018:Buffer.BlockCopycount 参数应指定要复制的字节数 使用 Buffer.BlockCopy 时,count 参数指定要复制的字节数。 应仅对元素大小正好为一个字节的数组将 Array.Length 用于 count 参数。 bytesbytebool 数组具有大小为一个字节的元素。
CA2019:ThreadStatic 字段不应使用内联初始化 使用 ThreadStaticAttribute 注释的字段在 static 构造函数(在 Visual Basic 中是 Shared 构造函数)进行内联或显式初始化。
CA2020:防止 IntPtr/UIntPtr 的内置运算符导致的行为更改 .NET 7 中添加的一些内置运算符的行为与 .NET 6 及更早版本中的用户定义运算符的行为不同。 某些用于在未检查上下文中引发的运算符,除非在检查的上下文中包装,否则溢出不再引发。 以前未在检查上下文中引发的某些运算符现在会引发,除非包装在未选中的上下文中。
CA2021:不要使用不兼容类型调用 Enumerable.Cast<T> 或 Enumerable.OfType<T> 调用 Enumerable.Cast<TResult>(IEnumerable)Enumerable.OfType<TResult>(IEnumerable) 会指定与输入集合的类型不兼容的类型参数。