C# 代码检查
在 C# 中,ReSharper 2026.3 提供两类代码检查:1287 项 检测错误的检查 ,例如损坏的语法、未解析的符号、编译器错误等(无法配置或禁用任何这些检查),以及 1075 项 专有代码检查 ,其中任一项都可以 禁用或更改其 严重性级别。
These code inspections help you detect code issues at design time in all open files, and additionally they allow you to find code issues in specific scope.
可配置的 C# 检查项如下所示,按其 类别分组。
代码通知(3 项检查)
此类别将严重性级别较低的代码检查分组。
C# 14 中使用 span 参数的重载解析中的重大变更 | |
方法调用被跳过 | |
部分代码无法解析 |
常见实践和代码改进(159 项检查)
此类别分组的检查主要查找中等严重性的问题,这些问题主要影响代码的可读性。
通过派生类型访问类型的静态成员 | |
忽略了 'Stream.Read()' 实际读取的字节数 | |
在本地函数前添加显式 'return' 或 'continue' | |
层次结构中的注解重复 | |
自动属性可以设为仅 get(非私有可访问性) | |
自动属性可以设为仅 get(私有可访问性) | |
基类成员有 'params' 参数,但重写方法没有 | |
可在 'Add' 前简化 'Contains' 检查 | |
类型转换表达式可替换为显式类型参数 | |
类型转换表达式可替换为显式变量类型 | |
类型转换表达式可替换为 lambda 返回类型 | |
类型转换表达式可替换为简化类型参数 | |
将锁字段类型更改为 'System.Threading.Lock' | |
检查引用相等性 | |
检查引用相等性 | |
检查引用相等性 | |
检查引用相等性 | |
类可以设为密封(不可继承)(非私有可访问性) | |
类可以设为密封(不可继承)(私有可访问性) | |
易混淆的类似代码块语句 | |
容器可空性属性用于非容器类型的声明 | |
将 'if do while' 转换为 'while' | |
将 'if' 转换为 '||' | |
将局部变量或字段转换为常量(非私有可访问性) | |
将局部变量或字段转换为常量(私有可访问性) | |
声明可空性已推断(参数被推断为非 null) | |
声明可空性已推断(参数被推断为可空) | |
声明可空性已推断(类型成员被推断为非 null) | |
声明可空性已推断(类型成员被推断为可空) | |
字典项移除可用单个 'Remove' 简化 | |
字典查找可用 'GetValueOrDefault' 简化 | |
字典查找可用 'TryAdd' 简化 | |
字典查找可用 'TryGetValue' 简化 | |
空语句是多余的 | |
提取通用属性模式 | |
字段可以设为 readonly(非私有可访问性) | |
字段可以设为 readonly(私有可访问性) | |
仅 get 的自动属性从未被赋值 | |
取反条件 | |
调用区分区域性 | |
迭代变量可声明为更具体的类型 | |
合并局部变量声明和赋值 | |
本地函数可设为 static | |
局部变量声明范围过宽 | |
将抽象类中的构造函数设为 protected | |
成员可以设为私有(非私有可访问性) | |
成员可以设为私有(私有可访问性) | |
成员可以设为受保护(非私有可访问性) | |
成员可以设为受保护(私有可访问性) | |
成员可以设为静态(共享)(非私有可访问性) | |
成员可以设为静态(共享)(私有可访问性) | |
成员或类型可以设为内部(友元) | |
方法有异步重载 | |
方法有支持取消的异步重载 | |
方法支持取消操作 | |
缺少 private 或 internal 类型或成员的 XML 注释 | |
多重可空属性的使用 | |
嵌套字符串插值可内联 | |
可空性属性用于 void 或值类型的声明 | |
可空性属性用于无法被其他代码直接引用的声明 | |
参数可以声明为基类型 | |
构造函数的参数可以声明为基类型 | |
参数类型可以是 IEnumerable<T>(非私有可访问性) | |
参数类型可以是 IEnumerable<T>(私有可访问性) | |
建议优先使用具体值而非 'default' 或 'new()' | |
属性可以设为仅 init(非私有可访问性) | |
属性可以设为仅 init(私有可访问性) | |
将本地函数放在 'return' 或 'continue' 之后 | |
多余的 'is' | |
移除构造函数调用 | |
移除多余语句 | |
移除多余语句 | |
移除 ToList() | |
移除 ToList() | |
用返回 'Task' 的 'async' 代码替换 | |
替换为 FirstOrDefault($args$) | |
替换为 FirstOrDefault($args$) | |
替换为 FirstOrDefault($args$) | |
替换为 FirstOrDefault($args$) | |
替换为 LastOrDefault($args$) | |
替换为 LastOrDefault($args$) | |
替换为 LastOrDefault($args$) | |
替换为 LastOrDefault($args$) | |
替换为 OfType<T>().Any() | |
替换为 OfType<T>().Any()(替换为 OfType<T>().Any(..)) | |
替换为 OfType<T>().Count() | |
替换为 OfType<T>().Count()(替换为 OfType<T>().Count(..)) | |
替换为 OfType<T>().First() | |
替换为 OfType<T>().First()(替换为 OfType<T>().First(..)) | |
替换为 OfType<T>().FirstOrDefault() | |
替换为 OfType<T>().FirstOrDefault()(替换为 OfType<T>().FirstOrDefault(..)) | |
替换为 OfType<T>().Last() | |
替换为 OfType<T>().Last()(替换为 OfType<T>().Last(..)) | |
替换为 OfType<T>().LastOrDefault() | |
替换为 OfType<T>().LastOrDefault()(替换为 OfType<T>().LastOrDefault(..)) | |
替换为 OfType<T>().LongCount() | |
替换为 OfType<T>().Single() | |
替换为 OfType<T>().Single()(替换为 OfType<T>().Single(..)) | |
替换为 OfType<T>().SingleOrDefault() | |
替换为 OfType<T>().SingleOrDefault()(替换为 OfType<T>().SingleOrDefault(..)) | |
替换为 OfType<T>().Where()(替换为 OfType<T>().Where(..)) | |
替换为简单赋值 | |
替换为简单赋值 | |
替换为单次赋值 | |
替换为单次赋值 | |
替换为单次调用 Any(..) | |
替换为单次调用 Count(..) | |
替换为单次调用 First(..) | |
替换为单次调用 FirstOrDefault(..) | |
替换为单次调用 Last(..) | |
替换为单次调用 LastOrDefault(..) | |
替换为单次调用 Single(..) | |
替换为单次调用 SingleOrDefault(..) | |
替换为 SingleOrDefault($args$) | |
替换为 SingleOrDefault($args$) | |
替换为 SingleOrDefault($args$) | |
替换为 SingleOrDefault($args$) | |
返回类型可以是 IEnumerable<T>(非私有可访问性) | |
返回类型可以是 IEnumerable<T>(私有可访问性) | |
简化条件三元表达式 | |
简化 'IsInstanceOfType()' 调用 | |
简化 LINQ 表达式(使用 'All') | |
简化 LINQ 表达式(使用 'Any') | |
简化取反模式 | |
简化取反关系模式 | |
简化负等式表达式 | |
显式指定字符串比较 | |
字符串字面量可内联 | |
字符串排序区分区域性 | |
结构体可以设为 readonly | |
结构体缺少 'IEquatable' 实现(非私有可访问性) | |
结构体缺少 'IEquatable' 实现(私有可访问性) | |
结构体成员可以设为 readonly | |
具有默认相等成员的结构体用于比较(非私有可访问性) | |
具有默认相等成员的结构体用于比较(私有可访问性) | |
try-catch 和 try-finally 语句可以合并 | |
类型可设为文件级私有 | |
类型参数可声明为协变或逆变 | |
具有可疑相等性的类型用于记录(非私有可访问性) | |
具有可疑相等性的类型用于记录(私有可访问性) | |
使用默认结构体相等性 | |
使用 'ArgumentException.ThrowIfNullOrEmpty/ThrowIfNullOrWhiteSpace' | |
使用 'ArgumentNullException.ThrowIfNull' | |
使用数组创建表达式 | |
使用数组创建表达式 | |
使用 'Array.Empty<T>()' | |
使用取消令牌 | |
使用编译器支持的可空属性 | |
使用 'EventArgs.Empty' | |
使用 'HashCode.Combine' 计算哈希代码 | |
使用索引属性 | |
使用 'is' 运算符 | |
使用方法 Any() | |
使用方法 Any() | |
使用方法 Any() | |
使用方法 Any() | |
使用方法 Any() | |
使用 'String.IsNullOrEmpty' | |
使用 'Type.EmptyTypes' |
编译器警告(212 项检查)
此类别中的检查会在编译前检测编译器警告。
'#warning' 指令 | |
[InterpolatedStringHandlerArgument] 应用于 lambda 参数时无效,调用处将被忽略。 | |
为 'ref readonly' 参数指定了默认值,但 'ref readonly' 仅应用于引用类型。 建议将参数声明为 'in'。 | |
局部变量以引用方式返回,但其初始化值无法以引用方式返回。 | |
变量的成员以引用方式返回,但其初始化值无法以引用方式返回 | |
带有 [DoesNotReturn] 标记的方法不应有返回值。 | |
可能的 null 值不应用于带有 [NotNull] 或 [DisallowNull] 标记的类型。 | |
前面的 catch 子句已捕获所有异常 | |
在此上下文中 stackalloc 表达式的结果可能会暴露到包含方法之外。 | |
日志消息中的模板在日志方法定义中没有对应的参数 | |
类型为 'System.Threading.Lock' 的值转换为其他类型时,在 'lock' 语句中可能会使用非预期的基于监视器的锁定机制 | |
通过匿名方法、lambda 表达式、查询表达式或迭代器中的 'base' 关键字访问成员会导致无法验证的代码 | |
对齐值 'value' 的绝对值大于 'magnitude limit',可能导致格式化字符串过大。 | |
XML 注释中存在歧义引用 | |
由于引用类型的可空性不同,参数无法作为输出用于对应参数。 | |
由于引用类型的可空性不同,参数无法用于对应参数。 | |
参数应为变量,因为其被传递给 'ref readonly' 参数。 | |
参数应使用 'in' 关键字传递。 | |
条件表达式中的赋值操作 | |
对同一变量进行了赋值 | |
异步函数未包含 await 表达式 | |
异步方法调用未包含 await 表达式 | |
异步 'Main' 方法不会被用作入口点,因为已找到同步入口点。 | |
异步迭代器包含一个或多个类型为 'CancellationToken' 的参数,但均未使用 'EnumeratorCancellation' 属性标注。 | |
'attribute modifier' 不是有效的属性位置。 此代码块中的所有属性都将被忽略 | |
'attribute modifier' 不是此声明的有效属性位置。 此代码块中的所有属性都将被忽略 | |
包含注释文件中的 XML 格式错误 | |
对符号扩展操作数使用按位或运算符 | |
从 'readonly' 成员调用非 readonly 成员会导致 'this' 被隐式复制 | |
无法将 null 字面量转换为非可空引用类型。 | |
无法解析 XML 注释中的引用 | |
类重写了 Object.Equals(object o) 但未重写 Object.GetHashCode() | |
代码不可达 | |
集合表达式可能导致意外的堆分配 | |
集合表达式因使用 '..' 展开可能导致意外的堆分配 | |
与可空值类型的 null 比较始终为 'false' | |
与整型常量的比较无意义;该常量超出了类型 'type' 的取值范围。 | |
将方法组转换为非委托类型 'object'. | |
将 null 字面量或可能为 null 的值转换为非可空类型。 | |
在 sealed 类中声明新的 protected 成员等同于声明为 private | |
为参数指定的默认值无效,因为该参数应用于不允许可选参数的成员 | |
可能对 null 引用进行了解引用操作。 | |
XML 注释中存在重复的 param 标签 | |
XML 注释中存在重复的 typeparam 标签 | |
空的 switch 代码块 | |
字段从未使用 | |
筛选表达式为常量,建议移除筛选条件 | |
给定表达式始终匹配所提供的模式 | |
给定表达式始终为所提供的类型 | |
给定表达式从不是所提供的类型 | |
'goto case' 的值无法隐式转换为所需类型 | |
在语言版本预览中,'field' 关键字绑定到属性的合成后备字段 | |
XML 注释中的签名不正确 | |
内联数组转换运算符不会用于从声明类型的表达式进行转换。 | |
内联数组索引器不会用于元素访问表达式。 | |
内联数组 'Slice' 方法不会用于元素访问表达式。 | |
对于元素字段为 'ref' 字段或类型参数无效的内联数组类型,不支持 'Inline arrays' 语言特性。 | |
引入 'Finalize' 方法可能会干扰析构函数的调用 | |
XML 注释中包含无效的 XML | |
XML 注释中包含无效的 include 元素 | |
'new' 关键字是多余的 | |
需要 'new' 关键字 | |
成员不能在此属性中使用。 | |
成员在函数退出时必须有条件地为非 null 值。 | |
成员在退出时必须为非 null 值。 | |
成员重写了已过时的成员 | |
方法缺少 '[DoesNotReturn]' 注解,无法与实现或重写的成员匹配。 | |
公开可见类型或成员缺少 XML 注释 | |
运行时存在多个重写候选项 | |
发现多个同名 Shader | |
命名空间应为此项目的默认命名空间 | |
未访问的字段 | |
未访问的局部变量 | |
非可空后备字段未初始化。 | |
非可空成员未初始化。 | |
类型参数约束中的可空性不匹配。 | |
显式接口说明符中的引用类型可空性与类型实现的接口不匹配。 | |
基类实现的接口中的引用类型可空性不匹配。 | |
返回类型中的引用类型可空性与实现的成员不匹配。 | |
返回类型中的引用类型可空性与隐式实现的成员不匹配。 | |
返回类型中的引用类型可空性与重写的成员不匹配。 | |
返回类型中的引用类型可空性与 partial 方法声明不匹配。 | |
返回类型中引用类型的可空性与目标委托不匹配(可能由于可空性属性导致)。 | |
拦截器方法中返回类型的引用类型可空性与可拦截方法不匹配 | |
源类型中引用类型的可空性与目标类型不匹配。 | |
类型中引用类型的可空性与已实现成员不匹配。 | |
类型中引用类型的可空性与隐式实现的成员不匹配。 | |
类型中引用类型的可空性与重写的成员不匹配。 | |
参数类型中引用类型的可空性与目标委托不匹配(可能由于可空性属性导致)。 | |
参数类型中引用类型的可空性与已实现成员不匹配。 | |
参数类型中引用类型的可空性与隐式实现的成员不匹配。 | |
参数类型中引用类型的可空性与可拦截方法不匹配 | |
参数类型中引用类型的可空性与重写的成员不匹配。 | |
参数类型中引用类型的可空性与 partial 成员声明不匹配。 | |
返回类型的可空性与已实现成员不匹配(可能由于可空性属性导致)。 | |
返回类型的可空性与隐式实现的成员不匹配(可能由于可空性属性导致)。 | |
返回类型的可空性与重写的成员不匹配(可能由于可空性属性导致)。 | |
类型参数的可空性与 'class' 约束不匹配。 | |
类型参数的可空性与约束类型不匹配。 | |
类型参数的可空性与 'notnull' 约束不匹配。 | |
参数类型的可空性与已实现成员不匹配(可能由于可空性属性导致)。 | |
参数类型的可空性与隐式实现的成员不匹配(可能由于可空性属性导致)。 | |
参数类型的可空性与重写的成员不匹配(可能由于可空性属性导致)。 | |
可空值类型可能为 null。 | |
对象或集合初始化器隐式解引用了可能为 null 的成员。 | |
已过时成员重写了非过时成员 | |
不应强制要求已过时的成员。 | |
运算符 '==' 或 '!=' 未重写 'Object.Equals(object o)' 和 'Object.GetHashCode()' | |
在使用预览功能前请先选择加入。 | |
参数在 XML 注释中没有匹配的 param 标签 | |
lambda 中的参数有 params 修饰符,但目标委托类型没有。 | |
参数被捕获到封闭类型的状态中,其值也会传递给基类构造函数。 该值也可能被基类捕获。 | |
参数被捕获到封闭类型的状态中,其值也用于初始化字段、属性或事件。 | |
参数在函数退出时必须有条件地为非 null 值。 | |
因 [NotNullIfNotNull] 注解中提及的参数为非 null,参数在退出时必须为非 null 值。 | |
参数在退出时必须为非 null 值。 | |
参数在参数列表中位于插值字符串处理程序参数之后。 | |
Partial 成员声明的签名不一致。 | |
partial 方法声明的类型参数可空性不一致。 | |
可能误用的空语句 | |
参数可能为 null 引用参数。 | |
可能为 null 的引用赋值。 | |
可能为 null 的引用返回值。 | |
可能为非预期的引用比较 | |
对作为 'using' 或 'lock' 语句参数的局部变量可能赋值不正确 | |
主构造函数参数被基类成员遮蔽。 | |
record 类型定义了 'Equals' 但未定义 'GetHashCode' | |
参数的引用类型修饰符与被隐藏成员中的对应参数不匹配。 | |
参数的引用类型修饰符与重写或实现成员中的对应参数不匹配。 | |
参数的引用类型修饰符与目标中的对应参数不匹配。 | |
对 volatile 字段的引用不会被视为 volatile | |
因 [NotNullIfNotNull] 注解中提及的参数为非 null,返回值必须为非 null。 | |
可拦截方法与拦截器方法的签名不匹配 | |
源文件已超出 PDB 可表示的 16,707,565 行限制;调试信息将不正确 | |
'is' 或 'as' 运算符中的静态类型。 | |
结构体成员以引用方式返回 'this' 或其他实例成员。 | |
XML 注释中的语法错误 | |
对 marshal-by-reference 类字段取地址 | |
模板应是静态表达式 | |
在异步方法中不应对参数或局部变量使用 '&' 运算符。 | |
可空引用类型的注解应仅在 '#nullable' 注解上下文中的代码中使用。 | |
可空引用类型的注解应仅在 '#nullable' 注解上下文中的代码中使用。 自动生成的代码需要在源文件中显式添加 '#nullable' 指令。 | |
ref 条件运算符的分支引用了声明作用域不兼容的变量。 | |
应用于参数的 CallerArgumentExpressionAttribute 无效,因为它是自引用的 | |
CallerArgumentExpressionAttribute 应用于无效的参数名。 | |
CallerArgumentExpressionAttribute 无效,因为其应用于不允许可选参数的成员 | |
CallerArgumentExpressionAttribute 无效;已被 CallerFilePathAttribute 覆盖 | |
CallerArgumentExpressionAttribute 无效;已被 CallerLineNumberAttribute 覆盖 | |
CallerArgumentExpressionAttribute 无效;已被 CallerMemberNameAttribute 覆盖 | |
CallerFilePathAttribute 将无效;其被 CallerLineNumberAttribute 覆盖 | |
CallerFilePathAttribute 将无效,因为其应用于不允许可选参数的上下文中使用的成员 | |
CallerLineNumberAttribute 将无效,因为其应用于不允许可选参数的上下文中使用的成员 | |
CallerMemberNameAttribute 将无效,因为其应用于不允许可选参数的上下文中使用的成员 | |
CallerMemberNameAttribute 将无效;其被 CallerFilePathAttribute 覆盖 | |
CallerMemberNameAttribute 将无效;其被 CallerLineNumberAttribute 覆盖 | |
目标委托类型中的默认参数值不匹配。 | |
'EnumeratorCancellation' 属性仅在返回 'IAsyncEnumerable<>' 的异步迭代器方法中应用于类型为 'CancellationToken' 的参数时有效。 | |
给定表达式始终匹配所提供的常量。 | |
给定表达式从不匹配所提供的模式。 | |
'l' 后缀容易与数字 '1' 混淆 | |
由于存在顶级语句的编译单元,'Main' 方法不会被用作入口点。 | |
与 'in' 参数对应的参数的 'ref' 修饰符等同于 'in'。 建议改用 'in'。 | |
与 'in' 参数对应的参数的 'ref' 修饰符等同于 'in'。 建议改用 'in'。 | |
该表达式的结果始终为可空类型的 'null' | |
该表达式的结果始终为 'true' 或 'false',因为值类型的值永远不等于 'null' | |
该表达式的结果始终为 'true' 或 'false',因为值类型的值永远不等于 'null' | |
参数的 'scoped' 修饰符与目标委托不匹配。 | |
参数的 'scoped' 修饰符与重写或实现的成员不匹配。 | |
switch 表达式未处理所有可能的输入(不完整)。 | |
switch 表达式未处理其输入类型的所有可能值(不完整)。 不过,带有 'when' 子句的模式可能会成功匹配该值。 | |
switch 表达式未处理部分 null 输入(不完整)。 | |
switch 表达式未处理部分 null 输入(不完整)。 不过,带有 'when' 子句的模式可能会成功匹配该值。 | |
switch 表达式未处理输入类型的部分值(不完整),涉及未命名的枚举值。 | |
元组元素名称被忽略,因为目标类型指定了不同的名称或未指定名称。 | |
元组 == 或 != 运算符另一侧指定了不同的名称或未指定名称,因此元组元素名称被忽略。 | |
类型名称仅包含小写 ASCII 字符。 此类名称可能会被语言保留使用 | |
根据当前的内存安全规则,'unsafe' 修饰符在这里没有任何作用 | |
partial 结构体的多次声明之间的字段没有定义顺序。 如需指定顺序,所有实例字段必须在同一声明中。 | |
该访问器应使用 'field',因为另一个访问器使用了它。 | |
此 ref 赋值的值只能通过 return 语句从当前方法中逸出。 | |
此 ref 赋值的值的逸出范围比目标更广,允许通过目标为逸出范围更窄的值赋值。 | |
此 ref 赋值将表达式赋给了逸出范围更窄的变量。 | |
此操作以引用方式返回了局部变量的成员,但该变量不是 ref 局部变量。 | |
此操作以引用方式返回了参数,但该参数不是 ref 参数。 | |
此操作以引用方式返回了参数,但其作用域仅限于当前方法。 | |
此操作通过 ref 参数以引用方式返回了参数;但只能在 return 语句中安全返回。 | |
此操作以引用方式返回了参数的成员,但该参数不是 ref 或 out 参数。 | |
此操作以引用方式返回了作用域仅限于当前方法的参数成员。 | |
此操作通过 ref 参数以引用方式返回了参数的成员;但只能在 return 语句中安全返回。 | |
此操作以引用方式返回了局部变量,但该变量不是 ref 局部变量。 | |
此操作对托管类型取地址、获取大小或声明指针。 | |
抛出的值可能为 null。 | |
类型已在接口列表中列出,但引用类型的可空性不同。 | |
该类型仅用于评估目的,未来更新中可能会更改或移除。 | |
此类型仅用于评估目的,可能会在未来更新中更改或移除。 抑制此诊断以继续。 | |
类型参数在 XML 注释中没有匹配的 typeparam 标签 | |
类型参数与外部类型的类型参数同名 | |
类型及别名不应命名为 'record' | |
无法包含 XML 片段 | |
未分配的字段 | |
未分配的 readonly 字段 | |
对可能为 null 的值进行拆箱操作。 | |
未解析的 Shader 名称 | |
未使用的局部变量 | |
在此上下文中使用变量可能导致引用的变量暴露到其声明作用域之外。 | |
使用了已过时的符号 | |
使用了已过时的符号(无消息) | |
使用 'is' 检查与 'dynamic' 的兼容性实际上等同于与 'Object' 的兼容性检查,对所有非 null 值均为 true | |
XML 注释中存在 'Parameter' 的 param 标签,但没有同名参数 | |
XML 注释中存在 'TypeParameter' 的 typeparam 标签,但没有同名类型参数 | |
XML 注释的 cref 属性引用了类型参数 | |
XML 注释未放置在有效的语言元素上 |
约束违规(11 项检查)
此类别包括代码检查,主要具有 警告 严重性级别,用于检测与符号属性相关的违规行为,包括 ReSharper 的代码注解 和其他类似问题。
需要基类类型 | |
BaseTypeRequired 属性仅支持类和接口 | |
命名不一致 | |
命名空间与文件位置不对应 | |
非可空或必需成员在构造函数退出时未初始化 | |
可能将 'null' 分配给非空实体 | |
可能违反 'ValueRange'/'NonNegativeValue' 属性 | |
契约注解定义存在问题 | |
必需基类类型与其他类型冲突 | |
'[BaseTypeRequired]' 属性中指定的类型与其他类型冲突 | |
带有 'CannotApplyEqualityOperatorAttribute' 标记的类型值应使用 'Equals()' 进行比较 |
Entity Framework(8 项检查)
此类别分组的代码检查用于校验 Entity Framework 及其派生类型的类型和成员的用法。
数据库函数不得在非数据库上下文中调用 | |
函数无法转换为 SQL,且不得在数据库上下文中调用 | |
可能对数据库发起多次查询(N+1 问题) | |
相关实体的数据库查询可能导致多次查询(N+1 问题) | |
字符串长度无限制可能导致性能问题 | |
查询相关实体时可能返回不完整数据 | |
此属性定义的关系导致依赖循环 | |
使用导航属性可能返回不完整数据 |
格式化(41 项检查)
此类别中的检查 检测代码格式问题。
空行不正确(其他位置缺少空行) | |
空行不正确(其他位置空行多余) | |
空行不正确(大括号附近空行数不正确) | |
缩进不正确(子语句周围) | |
缩进不正确(声明大括号周围) | |
缩进不正确(表达式大括号周围) | |
缩进不正确(命名空间大括号周围) | |
缩进不正确(预处理指令周围) | |
缩进不正确(语句大括号周围) | |
缩进不正确(switch 语句周围) | |
缩进不正确(缩进大小不正确) | |
缩进不正确(缩进级别未恢复) | |
缩进不正确(其他位置缺少缩进/取消缩进) | |
缩进不正确(其他位置缩进/取消缩进多余) | |
缩进不正确(制表符/空格不匹配) | |
换行不正确(列表中逗号周围) | |
换行不正确(声明大括号周围) | |
换行不正确(空大括号周围) | |
换行不正确(表达式大括号周围) | |
换行不正确(LINQ 查询周围) | |
换行不正确(括号周围) | |
换行不正确(语句大括号周围) | |
换行不正确(其他位置缺少换行) | |
换行不正确(其他位置存在多余换行) | |
换行不正确(一行有多条语句) | |
换行不正确(一行有多个类型成员) | |
缩进不正确(属性周围) | |
空格使用不正确(大括号周围) | |
空格使用不正确(冒号周围) | |
空格使用不正确(逗号周围) | |
缩进不正确(泛型括号周围) | |
空格使用不正确(成员访问符号周围) | |
空格使用不正确(运算符号周围) | |
空格使用不正确(括号周围) | |
空格使用不正确(分号周围) | |
空格使用不正确(语句中的方括号周围) | |
空格使用不正确(关键字与括号之间) | |
空格使用不正确(禁止多个空格) | |
空格使用不正确(其他位置缺少空格) | |
空格使用不正确(其他位置存在多余空格) | |
缩进不正确(此处禁止使用制表符) |
语法问题(4 项检查)
此类别中的检查报告字符串字面量和文档注释中的 语法问题。
注释中的语法错误 | |
标记属性值中的语法错误 | |
标记文本中的语法错误 | |
字符串字面量中的语法错误 |
语言用法机会(93 项检查)
此类别包括代码检查,主要具有 建议严重性级别,当可以使用更高级的语言结构时会通知您。 这些检查检测过时语言版本的语法,并建议使用更现代语言版本的功能。 对于大多数支持的语言,语言版本 可以自动检测或手动设置。
追加到集合表达式 | |
类无法实例化 | |
集合可移至展开元素 | |
条件表达式可重写为 null 合并运算符 | |
将 'as' 表达式类型检查及后续 null 检查转换为取反模式匹配 | |
将 'as' 表达式类型检查及后续 null 检查转换为模式匹配 | |
将包含单个 'with()' 的集合表达式转换为对象创建 | |
将构造函数转换为成员初始化器 | |
将构造函数转换为主构造函数 | |
将委托变量转换为局部函数 | |
将扩展方法转换为扩展块 | |
将 'goto' 语句转换为带标签的 'break' 或 'continue' | |
将 'if' 语句转换为 'switch' | |
转换为 'await using' 语句或声明 | |
转换为 lambda 表达式 | |
转换为静态类 | |
转换为 'using' 声明 | |
将 lambda 表达式转换为方法组 | |
将取反的 'is' 表达式转换为带取反模式的 'is' 表达式 | |
将 'Nullable<T>' 转换为 'T?' | |
将属性转换为自动属性 | |
将属性转换为自动属性(如可行) | |
将属性转换为带 private setter 的自动属性 | |
将静态方法调用转换为扩展成员调用(将限定的静态方法调用转换为扩展成员调用) | |
将静态方法调用转换为扩展成员调用(将同类静态方法调用转换为扩展方法调用) | |
Foreach 循环可以转换为 LINQ 表达式,但将使用另一个 'GetEnumerator' 方法 | |
for 循环可转换为 foreach 循环 | |
'if' 语句可重写为 '?:' 表达式 | |
'if' 语句可重写为 '??' 表达式 | |
'if' 语句可重写为 '??=' 赋值 | |
'if-return' 语句可重写为 'return' 语句 | |
内联 'out' 变量声明 | |
内联临时变量 | |
引入可选参数(非 private 可访问性) | |
引入可选参数(private 可访问性) | |
反转 'if' 语句以减少嵌套 | |
合并 'null' 检查与赋值 | |
Lambda 表达式/匿名方法可设为 'static' | |
为避免分配,Lambda 表达式/匿名方法必须为 'static' | |
Lambda 表达式/匿名方法不得捕获其所在上下文 | |
可通过使用逐字字符串减少字面量长度 | |
循环可以转换为 LINQ 表达式 | |
合并 'and' 模式 | |
将条件 ?: 表达式合并为条件访问 | |
将取反的 null/模式检查合并为复杂模式 | |
合并嵌套属性模式 | |
合并 null/模式检查为复杂模式 | |
合并 null/模式/值检查为 'or'/'and' 模式 | |
将顺序检查合并为单个条件访问检查 | |
移动到已存在的位置解构模式 | |
移动到扩展块 | |
将变量声明移入循环条件内 | |
Foreach 循环的一部分可以转换为 LINQ 表达式,但将使用另一个 'GetEnumerator' 方法 | |
循环体的一部分可以转换为 LINQ 表达式 | |
传递字符串插值表达式 | |
多余的访问器主体 | |
多余的展开元素 | |
用计算属性替换自动属性 | |
将控制流标志替换为带标签的 'break' 或 'continue' | |
用 null 传播代码替换 if 语句 | |
用 'var' 模式替换未执行任何额外检查的对象模式 | |
用常量模式替换 'SequenceEqual' | |
用区间索引器替换 'Slice' | |
用区间索引器替换 'Substring' | |
用 'switch' 表达式替换 'switch' 语句 | |
用 'switch' 表达式替换三元表达式 | |
替换为 '.OfType<T>()' | |
替换为 'field' 关键字 | |
替换为主构造函数参数 | |
使用别名 | |
使用集合表达式语法 | |
使用复合赋值 | |
使用复合赋值 | |
使用解构 | |
使用解构交换变量 | |
使用丢弃赋值 | |
使用末尾索引表达式 | |
使用 'nameof' 表达式引用枚举成员名 | |
使用 'nameof' 表达式引用名称 | |
在字符串字面量部分使用 'nameof' 表达式引用名称 | |
使用 'nameof' 表达式引用类型名 | |
注册 DependencyProperty 时使用 'nameof' 表达式 | |
尽可能使用对象或集合初始化器 | |
使用位置解构模式 | |
使用原始字符串 | |
使用字符串插值表达式 | |
使用类型注解语法 | |
使用无符号右移运算符 '>>>' | |
使用 UTF-8 字符串字面量 | |
使用 'with' 表达式复制匿名对象 | |
使用 'with' 表达式复制 record | |
使用 'with' 表达式复制结构体 | |
使用 'with' 表达式复制元组 |
NUnit(30 项检查)
这些检查检测与 NUnit 测试相关的代码问题。
NUnit。 异步测试方法必须返回 Task 或 Task<T> | |
NUnit。 存在重复值。 | |
NUnit。 参数属性被忽略。 | |
NUnit。 隐式未指定的 null 值。 | |
NUnit。 参数类型不兼容或参数值不正确。 | |
NUnit。 期望结果类型不兼容或值不正确。 | |
NUnit。 范围边界不正确。 'to' 必须大于或等于 'from'。 | |
NUnit。 区间步长符号不匹配。 | |
NUnit。 TestCase 属性缺少参数。 | |
NUnit。 测试方法声明缺少 'CancelAfter' 属性。 | |
NUnit。 非 void 测试方法缺少期望结果。 | |
NUnit。 属性中未提供任何值。 | |
NUnit。 非公有测试方法。 | |
NUnit。 区间 'step' 参数值必须为非零。 | |
NUnit。 TestCase 属性中存在多余参数。 | |
NUnit。 存在多余参数,未用作 ExpectedResult。 | |
NUnit。 void 测试方法存在多余的期望结果。 | |
NUnit。 指定的属性值生成的测试用例过多。 | |
NUnit。 指定的值与测试参数类型不兼容。 | |
NUnit。 测试用例 Result 属性与 ExpectedResult 重复。 | |
NUnit。 测试用例 Result 属性已过时。 | |
NUnit。 测试用例源必须为字段、属性或方法。 | |
NUnit。 测试用例源必须为非抽象类型并实现 IEnumerable。 | |
NUnit。 测试用例源必须为静态成员。 | |
NUnit。 使用该步长值无法达到最大区间值。 | |
NUnit。 未为测试方法参数提供值。 | |
NUnit。 区间内的值不适用于测试参数类型。 | |
NUnit.AutoFixture。 参数类型不兼容或参数值不正确。 | |
NUnit.AutoFixture。 缺少 Test 或 TestFixture 属性。 | |
NUnit.AutoFixture。 InlineAutoData 属性中存在多余参数。 |
潜在代码质量问题(233 项检查)
此类别包括检测关键问题(代码异味)的检查,主要具有 错误 或 警告 级别。 此类别还包括 确保本地化支持的检查。
'?:' 表达式的 true 和 false 分支相同 | |
[MustDisposeResource] 注解不会从基类构造函数继承,应显式添加 | |
[ThreadStatic] 不适用于实例字段 | |
已抑制的可空性警告可能隐藏潜在问题 | |
抽象或虚拟(可重写)事件从未被调用 | |
访问已释放的捕获变量 | |
在闭包中访问 foreach 变量 | |
访问已修改的捕获变量 | |
根据位掩码的值,表达式结果始终相同 | |
实际移位数为零 | |
文本参数中存在歧义符号 | |
层次结构中的注解冲突 | |
条件表达式中的赋值操作 | |
异步迭代器调用未使用 'await foreach' | |
异步方法没有使用 'await' 运算符(异步 Task 方法没有使用 'await' 运算符) | |
异步方法没有使用 'await' 运算符(异步 void 方法没有使用 'await' 运算符) | |
自动属性访问器从未使用(非私有可访问性) | |
自动属性访问器从未使用(私有可访问性) | |
避免混用变长转义序列与文本 | |
避免对返回类型为 'void' 的方法和函数使用 'async'(避免对带有 'System.EventArgs' 类型参数且返回类型为 'void' 的方法和函数使用 'async') | |
避免对返回类型为 'void' 的方法和函数使用 'async'(避免对没有 'System.EventArgs' 类型参数且返回类型为 'void' 的方法和函数使用 'async') | |
避免对返回类型为 'void' 的方法和函数使用 'async'(不要在 'async void' 方法和函数中重新抛出异常) | |
避免在委托类型返回 'void' 时使用 'async' lambda | |
后备字段已赋值但从未被使用 | |
后备字段被使用但从未赋值 | |
对未标记 [Flags] 属性的枚举进行按位运算 | |
调用具有隐式默认参数的基成员 | |
调用 'base.Equals(...)' 是引用相等 | |
文本参数中无法访问静态符号 | |
文本参数中无法访问符号 | |
无法解析属性 | |
无法解析资源 | |
无法解析资源项 | |
无法解析文本参数中的符号 | |
捕获的 marshal-by-reference 类字段引用可能导致运行时异常 | |
捕获的主构造函数参数可变 | |
捕获的 'volatile' 字段引用不会被视为 'volatile' | |
Char 可能被无意中用作数组大小 | |
Char 可能被无意中用作索引 | |
Char 可能被无意中当作整数使用 | |
类从未被实例化(非私有可访问性) | |
类从未被实例化(私有可访问性) | |
集合内容从未被查询(非私有可访问性) | |
集合内容从未被查询(私有可访问性) | |
集合从未被更新(非私有可访问性) | |
集合从未被更新(私有可访问性) | |
冲突的 CQRS 属性 | |
常量移位表达式的操作数均非零但结果为零 | |
协变数组转换 | |
CQRS 上下文交叉。 Command 从 Query 上下文中调用。 (显示在声明中) | |
CQRS 上下文交叉。 Command 从 Query 上下文中调用。 (显示在用法中) | |
CQRS 上下文交叉。 Query 从 Command 上下文中调用。 (显示在声明中) | |
CQRS 上下文交叉。 Query 从 Command 上下文中调用。 (显示在用法中) | |
已被 'using' 语句捕获的变量被释放 | |
至少有一条执行路径存在除零操作 | |
请勿在 readonly 字段中存储 SpinLock | |
请勿对 'using' 变量使用对象初始化器 | |
请勿对 'using' 变量使用对象初始化器(对象初始化器表达式在初始化 'using' 变量时可能抛出异常) | |
在格式字符串中格式说明符后不要使用右大括号 | |
字典/集合初始化中存在重复键 | |
链式 'if' 分支重复 | |
顺序 'if' 分支重复 | |
重复的 'switch' 分支项 | |
重复的 'switch' 分支体 | |
元素是可本地化的 | |
空的通用 catch 子句 | |
空的 'with' 表达式是多余的 | |
在显式 unchecked 上下文中调用 'Enumerable.Sum' | |
浮点数的相等性比较 | |
转义序列可简化 | |
事件从未被订阅(非私有可访问性) | |
事件从未被订阅(私有可访问性) | |
事件从未被调用 | |
通过匿名委托取消事件订阅 | |
可能是有意的异常重新抛出 | |
显式参数传递给带有调用者信息属性的参数 | |
提取通用代码 | |
字段隐藏了接口中带默认实现的属性 | |
已指定格式,但插值字符串表达式不是 IFormattable | |
函数体过于复杂,无法分析 | |
函数在所有执行路径上均为递归调用 | |
函数从未返回 | |
调用 'GC.SuppressFinalize' 的类型没有析构函数 | |
根据整数分析,该分支在启发式上不可达 | |
根据整数分析,switch 分支在启发式上不可达 | |
带有集合初始化器的 ImmutableArray<T> | |
传递给 'Math.Clamp()' 方法的参数不一致 | |
加锁顺序不一致 | |
字段上的同步操作不一致 | |
错误使用 'ConstantExpected' 特性 | |
末尾索引必须大于零;请使用 '^1' 表示最后一个元素 | |
标记为 ServiceContract 的接口应至少声明一个 OperationContract | |
无效的 XML 文档注释 | |
多态字段式事件的调用 | |
'IQueryable' 可能被无意中当作 'IEnumerable' 使用 | |
迭代器从未返回 | |
局部函数隐藏了方法 | |
局部变量隐藏了成员 | |
局部变量隐藏了主构造函数参数 | |
循环控制变量在循环体内从未被更改 | |
对输出参数使用 [HandlesResourceDisposal] 注解无意义 | |
对输入参数使用 [MustDisposeResource] 注解无意义 | |
成员隐藏了外部类中的静态成员 | |
成员初始化值被忽略 | |
方法从两个 CQRS 上下文中被调用(显示在声明中) | |
方法从两个 CQRS 上下文中被调用(显示在用法中) | |
方法已标记为 [OperationContract],但其所属类型未标记为 [ServiceContract] | |
带有可选或 'params' 参数的方法被重载隐藏 | |
重写方法中的可选参数值不匹配 | |
库代码中的异步可释放对象缺少 '.ConfigureAwait(false)' | |
库代码中缺少 '.ConfigureAwait(false)' | |
请将 shebang 指令移动到文件开头 | |
多次连续调用 'OrderBy' | |
未访问的字段(非私有可访问性) | |
未访问的字段(私有可访问性) | |
未访问的位置属性(非私有可访问性) | |
未访问的位置属性(私有可访问性) | |
实现类中的非公有成员隐藏了接口中的默认实现 | |
在 'GetHashCode()' 中引用的非 readonly 类型成员 | |
可空性与层级结构中的注解冲突 | |
可空性警告抑制运算符可能与取反的 'is' 表达式混淆 | |
'Object.ReferenceEquals' 始终为 false,因为它是用值类型调用的 | |
单向操作不得返回值 | |
可以使用运算符 'is'/'Type Of ... Is ...' | |
运算符未配对 checked 运算符 | |
重写的 GetHashCode 调用了基类 'Object.GetHashCode()' | |
参数隐藏了成员 | |
参数隐藏了主构造函数参数 | |
partial 成员声明中的参数名不同 | |
可能的“{0}.{1}: 集合已被修改” | |
通过接口访问成员时可能存在歧义 | |
可能对值类型与 'null' 进行比较 | |
可能存在循环构造函数调用 | |
可能的双重检查锁定模式的错误实现。 可能对检查字段的多次写访问。 | |
可能的双重检查锁定模式的错误实现。 对检查字段的读取访问。 | |
可能的无限继承 | |
可能存在小数部分丢失 | |
可能错误地传递了类型为 'System.Type' 的参数 | |
可能错误调用了 'GetType()' | |
可能的多次枚举 | |
可能发生溢出 | |
在 'checked' 上下文中可能发生溢出 | |
在 'unchecked' 上下文中可能发生溢出 | |
可能抛出 'System.ArgumentOutOfRangeException'。 索引必须为非负整数。 | |
可能抛出 'System.ArgumentOutOfRangeException'。 起始索引必须小于或等于结束索引。 | |
可能抛出 'System.InvalidCastException' | |
在 'foreach' 循环中可能抛出 'System.InvalidCastException' | |
可能抛出 'System.InvalidOperationException' | |
可能抛出 'System.NullReferenceException' | |
通过 'new' 表达式创建的对象可能未被赋值 | |
可能为非预期的引用比较 | |
可能在 readonly 变量上调用非纯结构体方法:结构体值在调用前始终被复制 | |
使用 'DefaultValueAttribute' 定义可选参数值可能存在误导 | |
索引器初始化器前可能缺少逗号 | |
可能错误使用了 'CancellationToken' | |
集合中可能为非预期的线性查找 | |
条件调用中可能为非预期的修改操作 | |
可能为非预期的字符串插值,而非格式字符串模板 | |
可能错误的字符串比较:仅当 span 指向同一内存位置时才相等 | |
lambda 或局部函数中的参数名可能具有误导性 | |
建议显式提供元组组件名称 | |
禁止捕获主构造函数参数 | |
冗余的容量实参 | |
带 [Optional] 属性的 'ref' 或 'out' 参数 | |
返回由 'using' 捕获对象生成的 task | |
返回被 'using' 语句捕获的变量 | |
函数的返回类型可设为非可空类型 | |
带有 [MustUseReturnValue] 注解的方法的返回值未被使用 | |
带有 [MustDisposeResource] 注解的方法的返回值从未被释放 | |
属性的返回值必须由调用方释放 | |
'GetEnumerator' 方法调用的返回值从未被释放 | |
迭代器的返回值未被使用 | |
纯方法的返回值未被使用 | |
返回值应被释放,但方法或函数未加 [MustDisposeResource] 注解 | |
安全类型转换表达式始终成功 | |
左操作数为零的移位表达式结果为零 | |
短生命周期的 'HttpClient' | |
检测到附近存在相似的匿名类型 | |
相似表达式比较 | |
枚举的部分值未在 'switch' 表达式中处理,而是在默认分支通过异常处理 | |
枚举的部分值未在 'switch' 语句中处理 | |
枚举的部分值未在 'switch' 语句中处理,而是在默认分支处理 | |
泛型类型中的静态字段或自动属性 | |
静态成员初始化器引用了下面或其他部分的静态成员 | |
字符串格式化方法问题 | |
结构化日志消息项重复或仅大小写不同 | |
结构化消息模板问题 | |
对同步原语加锁存在可疑情况 | |
ArgumentNullException 中的参数名可疑 | |
此类型左操作数的移位数可疑 | |
可疑的类型转换或检查 | |
使用了类似丢弃名称的变量,存在可疑情况 | |
可疑的 'volatile' 字段用法:复合操作不是原子的。 可改用 'Interlocked' 类。 | |
模块中可能在运行时缺失的符号 | |
尾递归调用可替换为循环 | |
'is' 运算符的表达式从不是所提供的类型 | |
'is' 运算符的给定表达式始终为所提供的类型 | |
该参数期望为常量,以获得最佳性能 | |
该模式是多余的,不会产生任何运行时检查 | |
源表达式始终匹配所提供的模式 | |
源表达式从不匹配所提供的模式 | |
线程静态字段具有初始化器 | |
尝试类型转换并检查 null 可用类型检查替代 | |
类型检查和强制转换可以合并 | |
类型模式与类型转换可合并 | |
未分配的字段(非私有可访问性) | |
未分配的字段(私有可访问性) | |
未分配的 readonly 字段 | |
未识别的 CQRS 实体 | |
未知的 Razor 布局 | |
未知的 Razor 区段 | |
<inheritdoc /> 的用法无效 | |
在根级别使用 <inheritdoc /> 以从基类候选项继承文档 | |
使用集合的 count 属性 | |
在格式字符串中使用格式说明符 | |
在插值字符串中使用格式说明符 | |
请使用 null 检查替代对任意非 null 值均为真的类型检查 | |
请使用 null 检查模式替代对任意非 null 值均为真的类型检查 | |
请使用可空注解替代属性 | |
无意义的算术运算 | |
'using' 应用于 '任务',而非其可释放结果 | |
在循环中使用 stackalloc | |
赋值给非变量限定符表达式的属性的值可能会丢失 | |
'value' 参数未被使用 | |
值元组 'GetHashCode()' 会忽略某些元素 | |
变量可声明为非可空类型 | |
局部函数中的变量隐藏了外部作用域的变量 | |
构造函数中调用虚成员 | |
'void' 方法带有 [MustDisposeResource] 属性注解 | |
'void' 方法带有 [MustUseReturnValue] 属性注解 | |
'void' 方法带有 [Pure] 属性注解 | |
使用 'with' 表达式替代对象初始化器 | |
'with' 表达式修改了所有可访问的实例成员 |
代码中的冗余(103 项检查)
此类别中的代码检查会查找冗余和无用代码,这些代码会影响代码的可读性和风格,并且可以安全地移除。 某些代码冗余无法自动修复,其快速修复需要在交互模式下完成,需用户输入。 但大多数冗余可以在无需用户交互的情况下修复,使用 范围内修复 或 代码清理。
'??' 条件已知为 null 或非 null | |
根据可空引用类型注解,'??' 条件永不为 null | |
[NotNull] 或 [CanBeNull] 属性应用于已由可空引用类型注解标记的类型 | |
匿名方法签名是多余的 | |
数组创建可替换为数组初始化器 | |
赋值未被使用 | |
赋值结果被完全丢弃 | |
与整型常量的比较无意义 | |
条件访问限定表达式已知为 null 或非 null | |
根据可空引用类型注解,条件访问限定表达式不为 null | |
在向字典添加项前调用 'ContainsKey' 是多余的 | |
CQRS 属性是冗余的,可予以删除 | |
双重取反运算符 | |
语句重复 | |
空的扩展块 | |
空的 for 循环是多余的 | |
空的区域 | |
显式委托创建表达式是多余的 | |
表达式始终为 'null' | |
表达式始终为 'true' 或始终为 'false' | |
根据可空引用类型注解,表达式始终为 'true' 或 'false' | |
启发式不可达代码 | |
立即调用委托 | |
Math.Abs() 的参数始终为非负数 | |
Math.Sign() 方法始终返回相同结果 | |
如果属性没有参数,括号是多余的 | |
模式始终为 'true' 或始终为 'false' | |
私有字段可转换为局部变量 | |
原始字符串可简化 | |
多余的 [AttributeUsage] 属性属性赋值 | |
多余的 'abstract' 修饰符 | |
匿名类型属性显式命名多余 | |
传递给调用者参数表达式参数的多余参数 | |
带默认值的参数多余 | |
算术溢出检查上下文多余 | |
'Attribute' 后缀多余 | |
'base.' 限定符多余 | |
布尔值比较多余 | |
集合初始化器中的大括号多余 | |
'case' 标签多余 | |
在 default 分支前的 'case' 标签多余 | |
多余的强制转换 | |
catch 子句多余 | |
record 声明中的 'class' 关键字多余 | |
集合复制多余 | |
赋值前的条件检查多余 | |
条件三元表达式用法多余 | |
使用 'ConfigureAwait' 捕获上下文多余 | |
多余的控制流跳转语句 | |
丢弃标识多余 | |
多余的 'else' 关键字 | |
对象创建表达式中的空参数列表多余 | |
冗余的空 finally 块 | |
空的对象或集合初始化器多余 | |
冗余的空 switch 分支 | |
冗余的空 'with()' | |
在 'params' 参数的参数中显式创建集合是多余的 | |
显式创建可空类型是多余的 | |
显式声明位置属性是多余的 | |
数组创建中的多余显式大小指定 | |
元组组件名称显式指定是多余的 | |
数组创建时显式指定类型是多余的 | |
fixed 指针声明是多余的 | |
全局 using 指令是多余的 | |
'IEnumerable.Cast<T>' 或 'IEnumerable.OfType<T>' 调用是多余的 | |
lambda 表达式参数类型说明是多余的 | |
lambda 签名括号是多余的 | |
名称限定符是多余的 | |
对已由非可空基类约束的类型参数使用 'notnull' 约束是多余的 | |
对已由另一个非可空基类约束的类型参数的基类约束使用可空注解是多余的 | |
对具有非可空类型种类的类型参数的基类约束使用可空注解是多余的 | |
对已由非可空基类约束的类型参数的 'class?' 约束使用可空注解是多余的 | |
可空属性是多余的 | |
可空指令是多余的 | |
可空警告抑制表达式是多余的 | |
'object.ToString()' 调用是多余的 | |
对值类型的 'object.ToString()' 调用是多余的 | |
逻辑条件表达式中的多余操作数 | |
'orderby' 子句中的 'ascending' 关键字多余 | |
属性模式子句多余 | |
区间边界多余 | |
'readonly' 修饰符多余 | |
'scoped' 参数修饰符多余 | |
类型或命名空间声明后的分号多余 | |
字符串插值多余 | |
'string.Format()' 调用多余 | |
'string.ToCharArray()' 调用多余 | |
冗余的 'switch' 表达式分支项 | |
'nameof' 内的类型参数多余 | |
方法的类型参数多余 | |
模式中的类型检查多余 | |
类型声明体多余 | |
冗余的 using 指令 | |
逐字前缀多余 | |
逐字字符串前缀多余 | |
'virtual' 修饰符多余 | |
'WithCancellation()' 调用多余 | |
移除多余的模式匹配括号 | |
始终匹配的子模式多余 | |
'true' 作为 for 语句条件多余 | |
对可空类型的类型检查等同于对其基础类型的类型检查 | |
不安全上下文声明多余 | |
未使用的可空指令 |
符号声明中的冗余(53 项检查)
此类别包括代码检查,主要为 警告严重性级别,用于检测空的和未使用的符号声明。
具有虚拟(可重写)成员的类从未被继承(非私有可访问性) | |
具有虚拟(可重写)成员的类从未被继承(私有可访问性) | |
元组的组成部分从未使用 | |
必须将 'DefaultParameterValueAttribute' 与 'OptionalAttribute' 结合使用 | |
空构造函数 | |
空析构函数 | |
“partial void”方法的空实现是多余的 | |
空命名空间声明 | |
实体仅用于捕获其名称(非私有可访问性) | |
实体仅用于捕获其名称(私有可访问性) | |
局部函数从未使用 | |
局部函数从未使用 | |
局部函数的返回值从未使用 | |
方法返回值从未使用(非私有可访问性) | |
方法返回值从未使用(私有可访问性) | |
未访问的局部变量 | |
未访问的局部变量仅用于丢弃 'out' 参数值 | |
未访问的主构造函数参数 | |
参数仅用于前置条件检查(非私有可访问性) | |
参数仅用于前置条件检查(私有可访问性) | |
参数输出值始终被丢弃(非私有可访问性) | |
参数输出值始终被丢弃(私有可访问性) | |
重写方法中始终忽略 'params' 修饰符 | |
冗余属性 [SetsRequiredMembers] | |
多余的基类构造函数调用 | |
基类型列表中多余的类或接口声明 | |
多余的成员初始化器 | |
多余的成员重写 | |
多余的方法重载(非 private 可访问性) | |
多余的方法重载(private 可访问性) | |
方法声明中的 'partial' 修饰符是多余的 | |
类型声明中的 'partial' 修饰符是多余的 | |
sealed 类中的 sealed 成员 | |
类型从未使用(非私有可访问性) | |
类型从未使用(私有可访问性) | |
类型成员从未通过基类型访问(非私有可访问性) | |
类型成员从未通过基类型访问(私有可访问性) | |
类型成员从未使用(非私有可访问性) | |
类型成员从未使用(私有可访问性) | |
类型成员仅在重写中使用(非私有可访问性) | |
类型成员仅在重写中使用(私有可访问性) | |
enum 的基础类型为 'int' | |
未使用的标签 | |
未使用的局部变量 | |
未使用的参数(非私有可访问性) | |
未使用的参数(私有可访问性) | |
部分方法中未使用的参数 | |
未使用的位置参数 | |
未使用的类型参数 | |
未使用的联合用例(非私有可访问性) | |
未使用的联合用例(私有可访问性) | |
虚拟(可重写)成员从未被重写(非私有可访问性) | |
虚拟(可重写)成员从未被重写(私有可访问性) |
安全性(1 项检查)
此类别中的检查会根据 Mend.io 报告存在漏洞的 NuGet 包。
存在安全漏洞的 API 使用 |
拼写问题(3 项检查)
这些检查 检测各种上下文中的拼写错误。
注释中的拼写错误 | |
标识符中的拼写错误 | |
字符串字面量中的拼写错误 |
语法风格(49 项检查)
此类别中的检查检测 代码语法样式的违规。 与大多数代码检查不同,这些检查是否将相同的代码结构检测为代码问题取决于在 ReSharper 选项 的 页面上配置的相应代码风格规则 Alt+R, O 。 您还可以使用 代码清理修复这些检查检测到的问题。
为避免优先级不明显请添加括号 | |
为静态成员添加/移除限定符 | |
添加/移除 'this.' 限定符 | |
调整修饰符声明顺序 | |
整理访问器顺序 | |
整理 null 检查模式 | |
空字符串样式 | |
合并或拆分区段中的属性 | |
解构声明中合并或拆分 'var' | |
将赋值表达式放入代码块 | |
移除多余的括号 | |
用 CLR 类型名或关键字替换内置类型引用 | |
在静态成员访问表达式中用 CLR 类型名或关键字替换内置类型引用 | |
用空行分隔流程转移语句 | |
行尾多余空白字符 | |
禁止使用制表符进行缩进 | |
类型成员应使用显式或隐式修饰符定义 | |
类型应使用显式或隐式修饰符定义 | |
使用首选参数风格 | |
使用首选参数风格用于匿名函数 | |
使用首选参数风格用于字面量值 | |
使用首选参数风格用于具名表达式 | |
使用首选参数风格用于字符串字面量值 | |
使用首选主体风格(转换为具有首选主体风格的构造函数或析构函数) | |
使用首选主体风格(转换为具有首选主体风格的局部函数) | |
使用首选主体风格(转换为具有首选主体风格的方法或运算符) | |
使用首选主体风格(转换为具有首选主体风格的属性、索引器或事件) | |
使用首选大括号风格(强制在 'do-while' 语句中使用大括号) | |
使用首选大括号风格(在 'fixed' 语句中强制使用大括号) | |
使用首选大括号风格(强制在 'for' 语句中使用大括号) | |
使用首选大括号风格(在 'foreach' 语句中强制使用大括号) | |
使用首选大括号风格(强制在 'if' 语句中使用大括号) | |
使用首选大括号风格(在 'lock' 语句中强制使用大括号) | |
使用首选大括号风格(在 'using' 语句中强制使用大括号) | |
使用首选大括号风格(强制在 'while' 语句中使用大括号) | |
使用首选大括号风格(移除多余的大括号) | |
使用首选命名空间主体风格 | |
使用首选丢弃声明风格 | |
在多行列表中新行前使用首选结尾逗号风格 | |
当最后一个元素后无新行时使用首选结尾逗号风格 | |
当类型明显时使用首选默认值表达式风格 | |
当类型不明显时使用首选默认值表达式风格 | |
当创建类型明显时使用首选 'new' 表达式风格 | |
当创建类型不明显时使用首选 'new' 表达式风格 | |
使用首选 'var' 风格(其他场景) | |
使用首选 'var' 风格(内置类型) | |
使用首选 'var' 风格(解构声明中) | |
使用首选 'var' 风格(类型简单时) | |
使用元组语法 |
Unity(47 项检查)
此类别中的检查报告特定于 Unity 项目的代码问题。
可用的非分配方法替代方案 | |
在继承自 'PropertyDrawer' 的类中避免使用 'base.OnGUI()' | |
无法解析组件或 ScriptableObject | |
DOTS:IAspect 字段必须为以下类型之一:RefRW、RefRO、EnabledRefRW、EnabledRefRO、DynamicBuffer 或 Entity | |
DOTS:类型关键字不一致 | |
DOTS:指定的类型必须为结构体类型 | |
已声明同名事件函数 | |
期望类型为 'Component' 或 'MonoBehaviour' 的派生类型 | |
期望类型为 'ScriptableObject' 的派生类型 | |
'ComponentLookup' 类型的字段在使用前必须先更新。 | |
文件名应与程序集名称一致 | |
未定义分组路径 | |
方法签名不正确 | |
Odin 分组属性类型不正确 | |
成员同时出现在多个 UI 分组中 | |
字符串字面量中引用的方法签名不符合预期 | |
'MonoBehaviour' 实例必须通过 'GameObject.AddComponent<T>()' 实例化,而非 'new' | |
参数应为 'Component' 的派生类型 | |
属性可能被错误地应用于多个字段 | |
对派生自 'UnityEngine.Object' 的类型进行 null 合并操作会绕过底层 Unity 引擎对象的生命周期检查,可能导致生命周期检查被非预期绕过 | |
对派生自 'UnityEngine.Object' 的类型进行 null 传播操作会绕过底层 Unity 引擎对象的生命周期检查,可能导致生命周期检查被非预期绕过 | |
对派生自 'UnityEngine.Object' 的类型进行模式匹配 null 检查会绕过底层 Unity 引擎对象的生命周期检查,可能导致生命周期检查被非预期绕过 | |
建议优先使用基于 GUID 的程序集引用 | |
属性用法多余(应用于此声明类型时属性多余) | |
属性用法多余('FormerlySerializedAs' 属性多余) | |
属性用法多余('HideInInspector' 属性多余) | |
属性用法多余('InitializeOnLoad' 属性多余) | |
属性用法多余('SerializeField' 属性多余) | |
Unity 事件函数多余 | |
多次访问内置组件的属性效率低下 | |
场景不存在 | |
场景在构建设置中被禁用 | |
'ScriptableObject' 实例必须通过 'ScriptableObject.CreateInstance<T>()' 实例化,而非 'new' | |
对象实例化后立即设置 'parent' 属性效率低下 | |
场景短名称不唯一 | |
基于字符串的图形属性查找效率低下 | |
基于字符串的组件类型查找效率低下 | |
构建设置中缺少索引 | |
输入名称未在 Input 管理器中定义 | |
'标签与图层' 中未定义该层 | |
项目中未定义该资源 | |
已为其他菜单项定义了相同的快捷键 | |
'标签与图层' 中未定义该标签 | |
项目中不存在同名动画状态 | |
构建设置中不存在同名场景 | |
如需在函数中使用 'GetSingleton' 调用的结果,'OnCreate' 必须包含 'RequireForUpdate' 调用 | |
请使用 'CompareTag' 替代显式字符串比较 |
Unity Burst 编译器警告(17 项检查)
此类别中的检查在代码实际编译之前报告 Unity Burst 编译器的警告。
不支持访问托管索引器 | |
不支持访问托管方法 | |
不支持装箱操作 | |
Burst:String.Format(format, ...) 参数类型无效 | |
Burst:变量解析为 System.String,可能导致 Burst 编译调用栈中出现无效的托管方法调用 | |
不支持创建托管类型 | |
调试日志函数仅接受字符串 | |
函数签名不能包含托管类型 | |
不支持从非 readonly 静态字段加载 | |
不支持加载托管类型 | |
共享静态类型参数需要非托管约束 | |
部分 SharedStatic`1.GetOrCreate 重载会导致编译器错误 | |
String.Format(format, ...) 仅接受字符串字面量和常量字符串 | |
不支持 'foreach' 结构 | |
不支持 try 语句 | |
在 Burst 中禁止使用 typeof | |
不支持写入静态字段 |
Unity 性能检查(5 项检查)
此类别中的检查报告 Unity 项目中的计算效率低下的模式。
'Camera.main' 性能开销较大 | |
高开销方法调用 | |
高开销 null 比较 | |
乘法运算顺序效率低下 | |
建议使用交错数组或一维数组替代多维数组 |
Unreal Build System(2 项检查)
此类别中的检查特定于 Unreal Engine项目。
项目文件中缺少插件依赖项 | |
不存在同名模块 |
Xunit(1 项检查)
These inspections detect code issues related to xUnit tests.
Xunit 测试中的控制台输出 |