可靠性规则

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

统治 描述
CA2000:在丢失范围 之前释放对象 由于发生异常事件可能会阻止对象的终结器运行,因此应在对象的所有引用都未在作用域外之前显式释放该对象。
CA2002:不要锁定标识弱的对象 据说对象在可以直接跨应用程序域边界进行访问时具有弱标识。 尝试获取具有弱标识的对象上的锁的线程可以阻止另一个应用程序域中具有相同对象的锁的线程。
CA2007:请勿直接等待任务 异步方法 直接等待Task
CA2008:如果不传递 TaskScheduler,请不要创建任务 任务创建或延续操作使用未指定 TaskScheduler 参数的方法重载。
CA2009:不要对 ImmutableCollection 值调用 ToImmutableCollection ToImmutable 方法在 System.Collections.Immutable 命名空间中不可变的集合上不必要地调用。
CA2011:请勿在其 setter 中分配属性 属性意外地在其自己的 set 访问器中分配了一个值。
CA2012:正确使用 ValueTasks 从成员调用返回的 ValueTask 旨在直接等待。 尝试多次使用 ValueTask 或直接访问其结果,然后才能知道已完成,可能会导致异常或损坏。 忽略此类 ValueTask 可能是功能 bug 的指示,可能会降低性能。
CA2013:不要将 ReferenceEquals 用于值类型 使用 System.Object.ReferenceEquals比较值时,如果 objA 和 objB 是值类型,则会在将值传递到 ReferenceEquals 方法之前对其进行装箱。 这意味着,即使 objA 和 objB 都表示值类型的同一实例,ReferenceEquals 方法仍返回 false。
CA2014:请勿在循环中使用 stackalloc。 堆栈分配的堆栈空间仅在当前方法调用结束时释放。 在循环中使用它可能会导致无限堆栈增长和最终堆栈溢出条件。
CA2015:不要为派生自 MemoryManager<T> 的类型定义终结器 将终结器添加到派生自 MemoryManager<T> 的类型可能允许内存在 Span<T>仍在使用时释放。
CA2016:将 CancellationToken 参数转发到采用一个 的方法 CancellationToken 参数转发到采用一个方法来确保操作取消通知得到正确传播,或显式传入 CancellationToken.None 以指示有意不传播令牌。
CA2017:参数计数不匹配 日志记录消息模板中提供的参数数与命名占位符的数目不匹配。
CA2018:要 Buffer.BlockCopycount 参数应指定要复制 的字节数 使用 Buffer.BlockCopy时,count 参数指定要复制的字节数。 应仅对元素大小正好是一个字节的数组使用 count 参数 Array.Lengthbytesbytebool 数组具有一个字节大小的元素。
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) 指定与输入集合类型不兼容的类型参数。
CA2022:避免使用 Stream.Read 进行不精确的读取 Stream.Read 的调用可能返回的字节数可能少于请求的字节数,因此如果未检查返回值,则会导致代码不可靠。
CA2024:请勿在异步方法中使用 StreamReader.EndOfStream 如果未缓冲任何数据,则属性 StreamReader.EndOfStream 可能会导致意外同步阻塞。 而是直接使用 StreamReader.ReadLineAsync(),在到达流的末尾时返回 null