C# 中的代码检查
在 C# 中,JetBrains Rider 2025.2 提供了两种代码检查:1241 项 用于检测错误的检查 ,例如语法错误、未解析的符号、编译器错误等(这些检查无法配置或禁用),以及 1064 项 专有代码检查 ,您可以 禁用或更改其 严重性级别。
这些 代码检查帮助您在所有打开的文件中 设计时检测代码问题,并且还允许您 在特定范围内查找代码问题。
可配置的 C# 检查列在下方,并按其 类别分组。
代码通知(2 项检查)
此类别包含轻微严重性级别的代码检查。
常见实践和代码改进(174 项检查)
此类别包含主要影响代码可读性的中等严重性问题的检查。
通过派生类型访问类型的静态成员 | |
忽略了 'Stream.Read()' 实际读取的字节数 | |
在局部函数之前添加显式的 'return' 或 'continue' | |
层次结构中的注解重复 | |
自动属性可以设置为仅 get(非私有访问权限) | |
自动属性可以设置为仅 get(私有访问权限) | |
基类成员有 'params' 参数,但重写者没有 | |
可以在 'Add' 之前简化 'Contains' | |
强制转换表达式可以替换为显式类型参数 | |
强制转换表达式可以替换为显式变量类型 | |
强制转换表达式可以替换为 lambda 返回类型 | |
强制转换表达式可以替换为简化的类型参数 | |
将锁字段类型更改为 'System.Threading.Lock' | |
改为检查引用相等性 | |
改为检查引用相等性 | |
改为检查引用相等性 | |
改为检查引用相等性 | |
类可以设为密封(不可继承)(非私有可访问性) | |
类可以设为密封(不可继承)(私有可访问性) | |
令人困惑的类似主体的语句 | |
容器可空性属性用于非容器类型的声明 | |
将 'if do while' 转换为 'while' | |
将 'if' 转换为 '||' | |
将局部变量或字段转换为常量(非私有可访问性) | |
将局部变量或字段转换为常量(私有可访问性) | |
声明的可空性已推断(参数被推断为非空) | |
声明的可空性已推断(参数被推断为可空) | |
声明的可空性已推断(类型成员被推断为非空) | |
声明的可空性已推断(类型成员被推断为可空) | |
字典项移除可以简化为单个 'Remove' | |
字典查找可以简化为 'GetValueOrDefault' | |
字典查找可以简化为 'TryAdd' | |
字典查找可以简化为 'TryGetValue' | |
空语句是多余的 | |
提取公共属性模式 | |
字段可以设为只读(非私有访问权限) | |
字段可以设为只读(私有访问权限) | |
仅可读自动属性从未被赋值 | |
反转条件 | |
迭代变量可以声明为更具体的类型 | |
合并局部变量的声明和赋值 | |
局部函数可以设为静态 | |
局部变量的声明范围过宽 | |
将抽象类中的构造函数设为受保护 | |
成员可以设为私有(非私有访问权限) | |
成员可以设为私有(私有访问权限) | |
成员可以设为受保护(非私有访问权限) | |
成员可以设为受保护(私有访问权限) | |
成员可以设为静态(共享)(非私有访问权限) | |
成员可以设为静态(共享)(私有访问权限) | |
成员或类型可以设为内部(友元) | |
方法具有异步重载 | |
方法具有支持取消的异步重载 | |
方法支持取消 | |
私有或内部类型或成员缺少 XML 注释 | |
多次使用可空属性 | |
嵌套字符串插值可以内联 | |
在 void 或值类型声明中使用可空属性 | |
可空属性用于无法从其他代码直接引用的声明 | |
参数可以声明为基类型 | |
构造函数的参数可以声明为基类型 | |
参数类型可以是 IEnumerable<T>(非私有可访问性) | |
参数类型可以是 IEnumerable<T>(私有可访问性) | |
建议使用具体值代替 'default' 或 'new()' | |
属性可以设置为仅初始化(非私有可访问性) | |
属性可以设置为仅初始化(私有可访问性) | |
将局部函数放在 'return' 或 'continue' 之后 | |
多余的 'is' | |
移除构造函数调用 | |
移除多余的语句 | |
移除多余的语句 | |
移除 ToList() | |
移除 ToList() | |
将 'async' 代码替换为返回 'Task' | |
替换为 FirstOrDefault($args$) | |
替换为 FirstOrDefault($args$) | |
替换为 FirstOrDefault($args$) | |
替换为 FirstOrDefault($args$) | |
替换为 LastOrDefault($args$) | |
替换为 LastOrDefault($args$) | |
替换为 LastOrDefault($args$) | |
替换为 LastOrDefault($args$) | |
替换为 OfType<T>() | |
替换为 OfType<T>() | |
替换为 OfType<T>() | |
替换为 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') | |
简化取反模式 | |
简化取反关系模式 | |
简化负等式表达式 | |
明确指定字符串比较 | |
明确指定字符串文化 | |
字符串字面量可以内联 | |
String.Compare 是特定于文化的(string.Compare(string, int, string, int) 是特定于文化的) | |
String.Compare 是特定于文化的(string.Compare(string, int, string, int, bool) 是特定于文化的) | |
String.Compare 是特定于文化的(string.Compare(string, int, string, int, bool) 是特定于文化的) | |
String.Compare 是特定于文化的(string.Compare(string, string) 是特定于文化的) | |
String.Compare 是特定于区域性的(string.Compare(string, string, bool) 是特定于区域性的) | |
String.Compare 是特定于区域性的(string.Compare(string, string, bool) 是特定于区域性的) | |
String.CompareTo 是特定于区域性的 | |
String.EndsWith 是特定于区域性的(string.EndsWith(string) 是特定于区域性的) | |
String.IndexOf 是特定于区域性的(string.IndexOf(string) 是特定于区域性的) | |
String.IndexOf 是特定于区域性的(string.IndexOf(string, int) 是特定于区域性的) | |
String.IndexOf 是特定于区域性的(string.IndexOf(string, int) 是特定于区域性的) | |
String.LastIndexOf 是特定于区域性的(string.LastIndexOf(string) 是特定于区域性的) | |
String.LastIndexOf 是特定于区域性的(string.LastIndexOf(string, int) 是特定于区域性的) | |
String.LastIndexOf 是特定于区域性的(string.LastIndexOf(string, int) 是特定于区域性的) | |
String.StartsWith 是特定于区域性的(string.StartsWith(string) 是特定于区域性的) | |
结构体可以声明为 readonly | |
结构体缺少 'IEquatable' 实现(非私有可访问性) | |
结构体缺少 'IEquatable' 实现(私有可访问性) | |
结构体成员可以声明为 readonly | |
使用默认相等成员的结构体用于比较(非私有可访问性) | |
使用默认相等成员的结构体用于比较(私有可访问性) | |
try-catch 和 try-finally 语句可以合并 | |
类型可以声明为文件本地 | |
类型参数可以声明为协变或逆变 | |
在记录中使用了具有可疑相等性的类型(非私有可访问性) | |
在记录中使用了具有可疑相等性的类型(私有可访问性) | |
使用默认结构体相等性 | |
使用 'ArgumentNullException.ThrowIfNull' | |
使用数组创建表达式 | |
使用数组创建表达式 | |
使用 'Array.Empty<T>()' | |
使用取消令牌 | |
使用编译器支持的可空属性 | |
使用 'EventArgs.Empty' | |
使用索引属性 | |
使用 'is' 运算符 | |
使用方法 Any() | |
使用方法 Any() | |
使用方法 Any() | |
使用方法 Any() | |
使用方法 Any() | |
使用 'String.IsNullOrEmpty' | |
使用 'Type.EmptyTypes' |
编译器警告(212 项检查)
此类别中的检查会在编译前检测到 编译器警告。
'#warning' 指令 | |
[InterpolatedStringHandlerArgument] 应用于 lambda 参数时无效,并将在调用点被忽略。 | |
为 'ref readonly' 参数指定了默认值,但 'ref readonly' 应仅用于引用。 请考虑将参数声明为 'in'。 | |
局部变量通过引用返回,但被初始化为无法通过引用返回的值。 | |
变量的成员通过引用返回,但被初始化为无法通过引用返回的值 | |
标记为 [DoesNotReturn] 的方法不应返回。 | |
可能的空值不能用于标记为 [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' 成员调用非只读成员会导致 'this' 的隐式副本 | |
无法将 null 字面量转换为非可空引用类型。 | |
无法解析 XML 注释中的引用 | |
类重写了 Object.Equals(object o) 但未重写 Object.GetHashCode() | |
代码不可达 | |
集合表达式可能会导致意外的堆分配 | |
集合表达式可能由于使用 '..' 展开而导致意外的堆分配 | |
与可空值类型的 null 比较总是会产生 'false' | |
与整数常量的比较是无用的;该常量超出了类型 'type' 的范围。 | |
将方法组转换为非委托类型 'object'。 | |
将 null 字面值或可能的 null 值转换为非可空类型。 | |
在密封类中声明新的受保护成员与将其声明为私有成员相同 | |
为参数指定的默认值将不起作用,因为它适用于不允许可选参数的上下文中的成员 | |
可能的 null 引用的解引用。 | |
XML 注释中重复的 param 标签 | |
XML 注释中重复的 typeparam 标签 | |
空的 switch 块 | |
字段从未使用过 | |
筛选表达式是一个常量,请考虑移除筛选器 | |
给定表达式总是匹配提供的模式 | |
给定表达式总是属于提供的类型 | |
给定表达式从不属于提供的类型 | |
'goto case' 值不能隐式转换为所需类型 | |
在语言版本预览中,'field' 关键字绑定到属性的合成后备字段 | |
XML 注释中的签名不正确 | |
错误使用 ConstantExpected 特性 | |
内联数组转换运算符不会用于从声明类型的表达式进行转换。 | |
内联数组索引器不会用于元素访问表达式。 | |
内联数组 'Slice' 方法不会用于元素访问表达式。 | |
'内联数组' 语言功能不支持具有 'ref' 字段或类型无效作为类型参数的元素字段的内联数组类型。 | |
引入 'Finalize' 方法可能会干扰析构函数的调用 | |
XML 注释中的 XML 无效 | |
无效的 XML 包含元素 | |
关键字 'new' 是多余的 | |
关键字 'new' 是必需的 | |
成员不能在此属性中使用。 | |
成员在退出函数时必须有条件地具有非空值。 | |
成员在退出时必须具有非空值。 | |
成员重写了已过时的成员 | |
方法缺少 '[DoesNotReturn]' 注解以匹配已实现或重写的成员。 | |
公开可见的类型或成员缺少 XML 注释 | |
运行时存在多个重写候选项 | |
找到多个具有相同名称的 Shader | |
命名空间应为此项目的默认命名空间 | |
未访问的字段 | |
未访问的局部变量 | |
不可为空的后备字段未初始化。 | |
不可为空的成员未初始化。 | |
类型参数的约束中存在可空性不匹配。 | |
显式接口说明符中的引用类型可空性与类型实现的接口不匹配。 | |
基类型实现的接口中的引用类型可空性不匹配。 | |
返回类型中的引用类型可空性与已实现的成员不匹配。 | |
返回类型中的引用类型可空性与隐式实现的成员不匹配。 | |
返回类型中的引用类型可空性与重写的成员不匹配。 | |
返回类型中的引用类型可空性与局部方法声明不匹配。 | |
返回类型中的引用类型可空性与目标委托不匹配(可能是由于可空性属性)。 | |
拦截器方法中的返回类型引用类型可空性与可拦截方法不匹配 | |
源类型中的引用类型可空性与目标类型不匹配。 | |
类型中引用类型的可空性与已实现成员不匹配。 | |
类型中引用类型的可空性与隐式实现的成员不匹配。 | |
类型中引用类型的可空性与重写的成员不匹配。 | |
参数类型中引用类型的可空性与目标委托不匹配(可能是由于可空性属性导致)。 | |
参数类型中引用类型的可空性与已实现成员不匹配。 | |
参数类型中引用类型的可空性与隐式实现的成员不匹配。 | |
参数类型中引用类型的可空性与可拦截方法不匹配。 | |
参数类型中引用类型的可空性与重写的成员不匹配。 | |
参数类型中引用类型的可空性与部分成员声明不匹配。 | |
返回类型的可空性与已实现成员不匹配(可能是由于可空性属性导致)。 | |
返回类型的可空性与隐式实现的成员不匹配(可能是由于可空性属性导致)。 | |
返回类型的可空性与重写的成员不匹配(可能是由于可空性属性导致)。 | |
类型参数的可空性与“class”约束不匹配。 | |
类型参数的可空性与约束类型不匹配。 | |
类型参数的可空性与“notnull”约束不匹配。 | |
参数类型的可空性与已实现成员不匹配(可能是由于可空性属性导致)。 | |
参数类型的可空性与隐式实现的成员不匹配(可能是由于可空性属性导致)。 | |
参数类型的可空性与重写的成员不匹配(可能是由于可空性属性导致)。 | |
可空值类型可能为 null。 | |
对象或集合初始化器隐式解引用了可能为 null 的成员。 | |
过时的成员重写了非过时的成员 | |
不应要求使用过时的成员。 | |
运算符“==”或运算符“!=”未重写“Object.Equals(object o)”和“Object.GetHashCode()” | |
在使用预览功能之前,请先选择加入。 | |
参数在 XML 注释中没有匹配的 param 标签 | |
参数在 lambda 中具有 params 修饰符,但在目标委托类型中没有。 | |
参数被捕获到封闭类型的状态中,其值也被传递到基构造函数。 该值可能也会被基类捕获。 | |
参数被捕获到封闭类型的状态中,其值也被用于初始化字段、属性或事件。 | |
参数在退出函数时必须有条件地具有非空值。 | |
参数在退出时必须具有非空值,因为在 [NotNullIfNotNull] 注解中提到的参数为非空。 | |
参数在退出时必须具有非空值。 | |
参数在参数列表中出现在插值字符串处理程序参数之后。 | |
partial 成员声明具有不同的签名 | |
局部方法声明的类型参数的可空性不一致。 | |
可能是错误的空语句。 | |
参数可能为 null 引用。 | |
可能的 null 引用赋值。 | |
可能的 null 引用返回值。 | |
可能的无意引用比较。 | |
可能错误地将值分配给 'using' 或 'lock' 语句的参数。 | |
主构造函数参数被基类型的成员遮蔽。 | |
记录定义了 'Equals' 但未定义 'GetHashCode'。 | |
参数的引用类型修饰符与隐藏成员中对应的参数不匹配。 | |
参数的引用类型修饰符与重写或实现的成员中对应的参数不匹配。 | |
参数的引用类型修饰符与目标中对应的参数不匹配。 | |
对易失性字段的引用不会被视为易失性。 | |
返回值必须为非空,因为在 [NotNullIfNotNull] 注解中提到的参数为非空。 | |
可拦截方法和拦截器方法的签名不匹配。 | |
源文件已超过 PDB 可表示的 16,707,565 行限制;调试信息将不正确。 | |
'is' 或 'as' 运算符中的静态类型。 | |
结构体成员通过引用返回 'this' 或其他实例成员。 | |
XML 注释中的语法错误 | |
获取按引用封送类字段的地址 | |
模板应为静态表达式 | |
在异步方法中不应对参数或局部变量使用 '&' 运算符。 | |
可空引用类型的注解应仅在 '#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 字符。 此类名称可能会成为语言的保留名称 | |
在部分结构的多个声明中,字段之间没有定义的顺序。 要指定顺序,所有实例字段必须在同一声明中。 | |
此 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 值都将成功。 | |
XML 注释中有一个 'param' 标签用于 'Parameter',但没有该名称的参数 | |
XML 注释中有一个 'typeparam' 标签用于 'TypeParameter',但没有该名称的类型参数 | |
XML 注释具有引用类型参数的 cref 属性 | |
XML 注释未放置在有效的语言元素上 |
约束违规(11 项检查)
此类别包括代码检查,主要具有 警告 严重性级别,检测与符号属性相关的违规,包括 JetBrains Rider 的代码注解 和其他类似问题。
需要基类型 | |
BaseTypeRequired 属性仅支持类和接口 | |
命名不一致 | |
命名空间与文件位置不一致 | |
不可为空或必需的成员在构造函数退出时未初始化 | |
可能将 'null' 分配给不可为空的实体 | |
可能违反 'ValueRange'/'NonNegativeValue' 属性 | |
契约注解定义中存在问题 | |
所需基类型与另一类型冲突 | |
'[BaseTypeRequired]' 属性中指定的类型与另一类型冲突 | |
标记为 'CannotApplyEqualityOperatorAttribute' 的类型值应使用 'Equals()' 进行比较 |
Entity Framework(8 项检查)
此类别分组了验证 Entity Framework及其派生类中类型和成员用法的代码检查。
数据库函数不得在非数据库上下文中调用 | |
函数无法转换为 SQL,且不得在数据库上下文中调用 | |
可能对数据库进行多次查询(N+1 问题) | |
可能对相关实体的数据库进行多次查询(N+1 问题) | |
无限字符串长度可能导致性能问题 | |
查询可能返回相关实体的不完整数据 | |
此属性定义的关系导致了依赖循环 | |
使用导航属性可能返回不完整数据 |
格式化(41 项检查)
此类别中的检查 检测代码格式问题。
不正确的空行(其他地方缺少空行) | |
不正确的空行(其他地方多余的空行) | |
不正确的空行(括号附近的空行数量不正确) | |
缩进错误(子语句周围) | |
不正确的缩进(声明括号周围) | |
不正确的缩进(表达式括号周围) | |
不正确的缩进(命名空间括号周围) | |
不正确的缩进(预处理指令周围) | |
不正确的缩进(语句括号周围) | |
缩进错误(switch 语句周围) | |
缩进错误(缩进大小不正确) | |
不正确的缩进(缩进级别未恢复) | |
不正确的缩进(其他地方缺少缩进/取消缩进) | |
不正确的缩进(其他地方多余的缩进/取消缩进) | |
缩进错误(制表符/空格不匹配) | |
不正确的换行(列表中的逗号周围) | |
不正确的换行(声明括号周围) | |
不正确的换行(空括号周围) | |
不正确的换行(表达式括号周围) | |
不正确的换行(LINQ 查询周围) | |
不正确的换行(括号周围) | |
不正确的换行(语句括号周围) | |
换行错误(其他地方缺少换行) | |
不正确的换行符(其他地方的换行符是多余的) | |
不正确的换行(同一行有多个语句) | |
不正确的换行(同一行有多个类型成员) | |
属性周围的间距不正确 | |
不正确的间距(大括号周围) | |
不正确的间距(冒号周围) | |
不正确的间距(逗号周围) | |
泛型括号周围的间距不正确 | |
不正确的间距(成员访问符号周围) | |
不正确的间距(运算符号周围) | |
不正确的间距(括号周围) | |
不正确的间距(分号周围) | |
不正确的间距(语句中的方括号周围) | |
不正确的间距(关键字和括号之间) | |
不正确的间距(禁止多个空格) | |
不正确的间距(其他地方缺少空格) | |
不正确的间距(其他地方的空格是多余的) | |
此处禁止使用制表符 |
语法问题(4 项检查)
此类别中的检查报告字符串字面量和文档注释中的 语法问题。
语言使用机会(85 项检查)
此类别包括代码检查,主要具有 建议 严重性级别,当可以使用更高级的语言结构时会通知您。 这些检查会检测过时语言版本的语法,并建议使用更现代语言版本的功能。 对于大多数支持的语言,语言版本 可以自动检测或手动设置。
追加到集合表达式 | |
类无法实例化 | |
条件表达式可以重写为 null 合并运算符 | |
将 'as' 表达式类型检查及后续的 null 检查转换为取反模式匹配 | |
将 'as' 表达式类型检查及后续的 null 检查转换为模式匹配 | |
将构造函数转换为成员初始化器 | |
将构造函数转换为主构造函数 | |
将委托变量转换为局部函数 | |
将 'if' 语句转换为 'switch' | |
转换为 'await using' 语句或声明 | |
转换为 lambda 表达式 | |
转换为静态类 | |
转换为 'using' 声明 | |
将 lambda 表达式转换为方法组 | |
将取反的 'is' 表达式转换为带取反模式的 'is' 表达式 | |
将 'Nullable<T>' 转换为 'T?' | |
将属性转换为自动属性 | |
将属性转换为自动属性(如果可能) | |
将属性转换为带私有 setter 的自动属性 | |
将静态方法调用转换为扩展方法调用 | |
foreach 循环可以转换为 LINQ 表达式,但将使用另一个 'GetEnumerator' 方法 | |
for 循环可以转换为 foreach 循环 | |
'if' 语句可以重写为 '?:' 表达式 | |
'if' 语句可以重写为 '??' 表达式 | |
'if' 语句可以重写为 '??=' 赋值 | |
'if-return' 语句可以重写为 'return' 语句 | |
内联 'out' 变量声明 | |
内联临时变量 | |
引入可选参数(非私有可访问性) | |
引入可选参数(私有可访问性) | |
反转 'if' 语句以减少嵌套 | |
将 null 检查与赋值合并 | |
Lambda 表达式/匿名方法可以设为 'static' | |
Lambda 表达式/匿名方法必须设为 'static' 以避免分配 | |
Lambda 表达式/匿名方法不得捕获包含上下文 | |
通过使用逐字字符串可以减少文字长度 | |
循环可以转换为 LINQ 表达式 | |
合并 'and' 模式 | |
将条件 ?: 表达式合并为条件访问 | |
将否定的 null/模式检查合并为复杂模式 | |
合并嵌套属性模式 | |
将 null/模式检查合并为复杂模式 | |
将 null/模式/值检查合并为 'or'/'and' 模式 | |
将顺序检查合并为单个条件访问检查 | |
移动到现有的定位解构模式 | |
将变量声明移动到循环条件内 | |
部分 foreach 循环可以转换为 LINQ 表达式,但将使用另一个 'GetEnumerator' 方法 | |
部分循环体可以转换为 LINQ 表达式 | |
传递字符串插值表达式 | |
冗余的访问器主体 | |
冗余的扩展元素 | |
将自动属性替换为计算属性 | |
将 if 语句替换为 null 传播代码 | |
将未执行任何额外检查的对象模式替换为 'var' 模式 | |
将 'SequenceEqual' 替换为常量模式 | |
将 'Slice' 替换为范围索引器 | |
将 'Substring' 替换为范围索引器 | |
将 'switch' 语句替换为 'switch' 表达式 | |
将三元表达式替换为 'switch' 表达式 | |
替换为 'field' 关键字 | |
替换为主构造函数参数 | |
使用别名 | |
使用集合表达式语法 | |
使用复合赋值 | |
使用复合赋值 | |
使用解构 | |
使用解构交换变量 | |
使用丢弃赋值 | |
使用从末尾索引表达式 | |
使用 'nameof' 表达式引用枚举成员名称 | |
使用 'nameof' 表达式引用名称 | |
使用 'nameof' 表达式引用字符串文字部分中的名称 | |
使用 'nameof' 表达式引用类型名称 | |
在注册 DependencyProperty 时使用 'nameof' 表达式 | |
在可能的情况下使用对象或集合初始化器 | |
使用位置解构模式 | |
使用原始字符串 | |
使用字符串插值表达式 | |
使用类型注解语法 | |
使用无符号右移运算符 '>>>' | |
使用 UTF-8 字符串字面量 | |
使用 'with' 表达式复制匿名对象 | |
使用 'with' 表达式复制记录 | |
使用 'with' 表达式复制结构体 | |
使用 'with' 表达式复制元组 |
NUnit(30 项检查)
这些检查会检测与 NUnit 测试相关的代码问题。
NUnit。 异步测试方法必须返回 Task 或 Task<T> | |
NUnit。 重复的值。 | |
NUnit。 被忽略的参数属性。 | |
NUnit。 隐式未指定的空值。 | |
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 属性中存在冗余参数。 |
潜在的代码质量问题(222 项检查)
此类别包括检测关键问题(代码异味)的检查,主要具有 错误 或 警告 级别。 此类别还包括 确保本地化支持的检查。
'?:' 表达式的 true 和 false 分支相同 | |
[MustDisposeResource] 注解未从基类构造函数继承,应显式放置 | |
[ThreadStatic] 无法与实例字段一起使用 | |
被抑制的可空警告可能隐藏潜在问题 | |
抽象或虚拟(可重写)事件从未被调用 | |
访问已释放的捕获变量 | |
在闭包中访问 foreach 变量 | |
访问已修改的捕获变量 | |
根据位掩码的值,表达式结果将始终相同 | |
实际移位计数为零 | |
文本参数中存在模糊符号 | |
层次结构中的注解冲突 | |
条件表达式中的赋值 | |
异步迭代器调用未使用 'await foreach' | |
自动属性访问器从未使用(非私有访问权限) | |
自动属性访问器从未使用(私有访问权限) | |
避免混合使用可变长度的转义序列和文本 | |
避免在返回类型为 'void' 且参数类型为 'System.EventArgs' 的方法和函数中使用 'async' | |
避免在返回类型为 'void' 且没有 'System.EventArgs' 类型参数的方法和函数中使用 'async' | |
避免在委托类型返回 'void' 时使用 'async' lambda | |
后备字段已赋值但从未使用 | |
后备字段已使用但从未赋值 | |
对未标记 [Flags] 属性的枚举进行按位操作 | |
调用具有隐式默认参数的基成员 | |
调用 'base.Equals(...)' 是引用相等 | |
无法在文本参数中访问静态符号 | |
无法在文本参数中访问符号 | |
无法解析属性 | |
无法解析资源 | |
无法解析资源项 | |
无法在文本参数中解析符号 | |
捕获的按引用传递类的字段引用可能导致运行时异常 | |
捕获的主构造函数参数是可变的 | |
捕获对 'volatile' 字段的引用不会被视为 'volatile' | |
字符可能被无意中用作整数 | |
类从未被实例化(非私有访问权限) | |
类从未被实例化(私有访问权限) | |
集合内容从未被查询(非私有访问权限) | |
集合内容从未被查询(私有访问权限) | |
集合从未更新(非私有访问权限) | |
集合从未更新(私有访问权限) | |
存在冲突的 CQRS 特性 | |
具有非零操作数的常量移位表达式结果为零值 | |
协变数组转换 | |
CQRS 上下文交叉。 Command 从 Query 上下文中调用。 (显示在声明处) | |
CQRS 上下文交叉。 Command 从 Query 上下文中调用。 (显示在用法处) | |
CQRS 上下文交叉。 Query 从 Command 上下文中调用。 (显示在声明处) | |
CQRS 上下文交叉。 Query 从 Command 上下文中调用。 (显示在用法处) | |
已被 'using' 语句捕获的变量的释放 | |
至少一个执行路径中存在除以零 | |
请勿在 'async void' 方法和函数中重新抛出异常 | |
不要在 readonly 字段中存储 SpinLock | |
不要对 'using' 变量使用对象初始化器 | |
不要对 'using' 变量使用对象初始化器(对象初始化器表达式在初始化 'using' 变量时可能抛出异常) | |
不要在格式字符串的格式说明符后使用右大括号 | |
字典/集合初始化中存在重复键 | |
重复的链式 'if' 分支 | |
重复的顺序 'if' 分支 | |
重复的 'switch' 分支 | |
重复的 'switch' 分支 | |
元素可本地化 | |
空的一般 catch 子句 | |
空的 'with' 表达式是多余的 | |
在显式 unchecked 上下文中调用 'Enumerable.Sum' | |
浮点数的相等性比较 | |
转义序列可以简化 | |
事件从未被订阅(非私有访问权限) | |
事件从未被订阅(私有访问权限) | |
事件从未被调用 | |
通过匿名委托取消事件订阅 | |
可能是有意重新抛出异常 | |
显式参数传递给具有调用者信息属性的参数 | |
提取公共代码 | |
字段隐藏了接口中具有默认实现的属性 | |
指定了格式,但插值字符串表达式不是 IFormattable | |
函数体过于复杂,无法分析 | |
函数在所有执行路径上都是递归的 | |
函数从不返回 | |
类型没有析构函数却调用了 'GC.SuppressFinalize' | |
根据整数分析,启发式不可达的情况 | |
根据整数分析,启发式不可达的 switch 分支 | |
传递给 'Math.Clamp()' 方法的参数不一致 | |
获取锁的顺序不一致 | |
字段上的同步不一致 | |
从末尾的索引必须大于零;使用 '^1' 引用最后一个元素 | |
标记为 ServiceContract 的接口应至少声明一个 OperationContract | |
无效的 XML 文档注释 | |
调用了多态的类似字段的事件 | |
IQueryable 可能被无意中用作 IEnumerable | |
迭代器从不返回 | |
局部函数隐藏了方法 | |
局部变量隐藏了成员 | |
局部变量隐藏了主构造函数参数 | |
循环控制变量在循环内从未更改 | |
对输出参数的 [HandlesResourceDisposal] 注解无意义 | |
对输入参数的 [MustDisposeResource] 注解无意义 | |
成员隐藏了外部类的静态成员 | |
成员初始化的值被忽略 | |
该方法同时从 CQRS 的两个上下文中被调用(显示在声明处) | |
该方法从两个 CQRS 上下文中被调用(在引用中显示) | |
方法被标记为 OperationContract,但包含的类型未标记为 ServiceContract | |
具有可选或 'params' 参数的方法被重载隐藏 | |
重写方法中可选参数值不匹配 | |
库代码中异步可释放对象缺少 '.ConfigureAwait(false)' | |
库代码中缺少 '.ConfigureAwait(false)' | |
将 shebang 指令移动到文件开头 | |
多次连续调用 'OrderBy' | |
未访问的字段(非私有访问权限) | |
未访问的字段(私有访问权限) | |
未访问的位置属性(非私有访问权限) | |
未访问的位置属性(私有访问权限) | |
实现类中的非公共成员隐藏了接口中的默认实现 | |
在 'GetHashCode()' 中引用了非只读类型成员 | |
可空性与层次结构中的注解冲突 | |
可空警告抑制运算符可能与反转的 'is' 表达式混淆 | |
'Object.ReferenceEquals' 始终为 false,因为它是用值类型调用的 | |
单向操作不得返回值 | |
可以使用运算符 'is'/'Type Of ... Is ...' | |
运算符没有匹配的检查运算符 | |
重写的 GetHashCode 调用了基类 'Object.GetHashCode()' | |
参数隐藏了成员 | |
参数隐藏了主构造函数参数 | |
参数名称在部分成员声明之间不同 | |
通过接口访问成员时可能存在歧义 | |
值类型与 'null' 的比较可能存在问题 | |
可能的循环构造函数调用 | |
可能不正确的双重检查锁定模式实现。 可能对检查字段进行多次写入访问。 | |
可能不正确的双重检查锁定模式实现。 读取检查字段的访问。 | |
可能的无限继承 | |
可能的分数丢失 | |
可能的类型为 'System.Type' 的错误参数 | |
可能的错误 'GetType()' 调用 | |
可能的多次枚举 | |
可能的溢出 | |
检查上下文中的可能溢出 | |
未检查上下文中的可能溢出 | |
可能的 'System.ArgumentOutOfRangeException'。 索引必须是非负整数。 | |
可能的 'System.ArgumentOutOfRangeException'。 起始索引必须小于或等于结束索引。 | |
可能的 'System.InvalidCastException' | |
foreach 循环中可能的 'System.InvalidCastException' | |
可能的 'System.InvalidOperationException' | |
可能的 'System.InvalidOperationException: 集合已被修改' | |
可能的 'System.NullReferenceException' | |
可能由 'new' 表达式创建的未分配对象 | |
可能的无意引用比较。 | |
可能在 readonly 变量上调用了非纯结构体方法:在调用之前结构体值始终会被复制 | |
可能误导的 'DefaultValueAttribute' 用法以定义可选参数值 | |
索引器初始化器前可能缺少逗号 | |
可能错误使用了 'CancellationToken' | |
集合中可能的无意线性搜索 | |
条件调用中可能的无意修改 | |
可能的无意字符串插值而非格式字符串模板 | |
可能的字符串比较错误:只有在指向相同内存位置时,跨度才相等 | |
Lambda 或局部函数中可能具有误导性的参数名称 | |
建议显式提供元组组件名称 | |
不允许捕获主构造函数参数 | |
带有 [Optional] 属性的 'ref' 或 'out' 参数 | |
返回由 'using' 捕获的对象生成的任务 | |
返回由 'using' 语句捕获的变量 | |
函数的返回类型可以设为非可空 | |
未使用带有 [MustUseReturnValue] 注解的方法的返回值 | |
带有 [MustDisposeResource] 注解的方法的返回值从未被释放 | |
属性的返回值必须由调用方释放 | |
'GetEnumerator' 方法调用的返回值从未被释放 | |
未使用迭代器的返回值 | |
未使用纯方法的返回值 | |
返回值应被释放,但方法或函数未带有 [MustDisposeResource] 注解 | |
安全类型转换表达式始终成功 | |
左操作数为零的移位表达式等于零 | |
附近检测到相似的匿名类型 | |
相似表达式比较 | |
枚举的一些值未在 'switch' 表达式中处理,而是通过默认分支中的异常处理 | |
枚举的一些值未在 'switch' 语句中处理 | |
枚举的一些值未在 'switch' 语句中处理,而是通过默认分支处理 | |
泛型类型中的静态字段或自动属性 | |
静态成员初始化器引用了下面或其他部分的静态成员 | |
字符串格式化方法问题 | |
结构化日志消息项重复或仅大小写不同 | |
结构化消息模板问题 | |
同步原语上的可疑锁定 | |
ArgumentNullException 中的可疑参数名称 | |
此类型左操作数的可疑移位计数 | |
可疑的类型转换或检查 | |
使用具有丢弃样式名称的变量的可疑用法 | |
可疑的 'volatile' 字段使用:复合操作不是原子的。 'Interlocked' 类可以代替使用。 | |
模块中的符号可能在运行时丢失 | |
尾递归调用可以替换为循环 | |
'is' 运算符的表达式永远不是提供的类型 | |
'is' 运算符的给定表达式始终是提供的类型 | |
模式是多余的,不会产生任何运行时检查 | |
源表达式始终匹配提供的模式 | |
源表达式从不匹配提供的模式 | |
线程静态字段具有初始化器 | |
尝试转换并检查 null 可以替换为类型检查 | |
类型检查和转换可以合并 | |
类型模式和转换可以合并 | |
未赋值的字段(非私有访问权限) | |
未赋值的字段(私有访问权限) | |
未赋值的 readonly 字段 | |
未识别的 CQRS 实体 | |
未知的 Razor 布局 | |
未知的 Razor 部分 | |
<inheritdoc /> 的使用无效 | |
在根级别使用 <inheritdoc /> 从基候选项继承文档 | |
使用集合的 count 属性 | |
在格式字符串中使用格式说明符 | |
在插值字符串中使用格式说明符 | |
使用空值检查代替对任何非空值成功的类型检查 | |
使用空值检查模式代替对任何非空值成功的类型检查 | |
使用可空注解代替属性 | |
无用的算术运算 | |
在循环中使用 stackalloc | |
分配给非变量限定符表达式的属性的值可能会丢失 | |
'value' 参数未被使用 | |
变量可以声明为非可空 | |
局部函数中的变量隐藏了外部作用域中的变量 | |
在构造函数中调用虚成员 | |
'void' 方法带有 [MustDisposeResource] 属性注解 | |
'void' 方法带有 [MustUseReturnValue] 属性注解 | |
'void' 方法带有 [Pure] 属性注解 | |
'with' 表达式被用来代替对象初始化器 | |
'with' 表达式修改了所有可访问的实例成员 |
代码中的冗余(101 项检查)
此类别中的代码检查查找冗余和无用代码,这些代码会影响代码的可读性和样式,可以安全地删除。 某些代码冗余无法自动修复,针对这些冗余的快速修复将在交互模式下执行,需要用户输入。 但大多数冗余可以在无需用户交互的情况下修复,使用 范围内修复 或 代码清理。
'??' 条件已知为 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' 标签 | |
默认部分之前的多余 'case' 标签 | |
冗余的强制转换 | |
多余的 catch 子句 | |
记录声明中多余的 'class' 关键字 | |
多余的集合复制 | |
赋值前的多余条件检查 | |
多余的条件三元表达式使用 | |
使用 'ConfigureAwait' 捕获上下文的多余操作 | |
冗余的控制流跳转语句 | |
多余的丢弃符号指定 | |
冗余的 'else' 关键字 | |
对象创建表达式中多余的空参数列表 | |
多余的空 finally 块 | |
多余的空对象或集合初始化器 | |
多余的空 switch 部分 | |
在 'params' 参数的参数中冗余的显式集合创建 | |
冗余的显式可空类型创建 | |
冗余的显式位置属性声明 | |
冗余的显式数组大小指定 | |
冗余的显式元组组件名称 | |
在数组创建中冗余的显式类型 | |
冗余的固定指针声明 | |
冗余的全局 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' 语句条件是多余的 | |
对可空类型的类型检查等同于对基础类型的检查 | |
不安全上下文声明是多余的 | |
未使用的可空指令 |
符号声明中的冗余(51 项检查)
此类别包括代码检查,主要是 警告 严重级别,用于检测空的和未使用的符号声明。
具有虚拟(可重写)成员的类从未被继承(非私有访问权限) | |
具有虚拟(可重写)成员的类从未被继承(私有访问权限) | |
元组的组件从未使用 | |
'DefaultParameterValueAttribute' 必须与 'OptionalAttribute' 一起使用 | |
空构造函数 | |
空析构函数 | |
'partial void' 方法的空实现是多余的 | |
空命名空间声明 | |
实体仅用于捕获其名称(非私有访问权限) | |
实体仅用于捕获其名称(私有访问权限) | |
局部函数从未使用 | |
局部函数从未使用 | |
局部函数的返回值从未使用 | |
方法返回值从未被使用(非私有访问权限) | |
方法返回值从未被使用(私有访问权限) | |
未访问的局部变量 | |
未访问的局部变量仅用于丢弃 'out' 参数值 | |
未访问的主构造函数参数 | |
参数仅用于前置条件检查(非私有访问权限) | |
参数仅用于前置条件检查(私有访问权限) | |
参数输出值始终被丢弃(非私有访问权限) | |
参数输出值始终被丢弃(私有访问权限) | |
'params' 修饰符在重写中始终被忽略 | |
多余的特性 [SetsRequiredMembers] | |
多余的基构造函数调用 | |
基类型列表中多余的类或接口规范 | |
多余的成员初始化器 | |
多余的成员重写 | |
冗余的方法重载(非私有可访问性) | |
冗余的方法重载(私有可访问性) | |
方法声明中的冗余 'partial' 修饰符 | |
类型声明中的冗余 'partial' 修饰符 | |
密封类中的密封成员 | |
类型从未使用(非私有访问权限) | |
类型从未使用(私有访问权限) | |
类型成员从未通过基类型访问(非私有访问权限) | |
类型成员从未通过基类型访问(私有访问权限) | |
类型成员从未使用(非私有访问权限) | |
类型成员从未使用(私有访问权限) | |
类型成员仅在重写中使用(非私有访问权限) | |
类型成员仅在重写中使用(私有访问权限) | |
枚举的基础类型为 'int' | |
未使用的标签 | |
未使用的局部变量 | |
未使用的参数(非私有访问权限) | |
未使用的参数(私有访问权限) | |
部分方法中未使用的参数 | |
未使用的位置参数 | |
未使用的类型参数 | |
虚拟(可重写)成员从未被重写(非私有访问权限) | |
虚拟(可重写)成员从未被重写(私有访问权限) |
安全性(1 项检查)
此类别中的检查会报告依据 Mend.io 显示存在漏洞的 NuGet 包。
易受攻击的 API 使用 |
拼写问题(3 项检查)
这些检查 检测各种上下文中的拼写错误。
注释中的拼写错误 | |
标识符中的拼写错误 | |
字符串文字中的拼写错误 |
语法样式(46 项检查)
此类别中的检查会检测 代码语法样式的违规行为。 与大多数代码检查不同,这些检查可以根据 JetBrains Rider 设置 页上配置的相应代码样式规则,检测到相同的代码结构作为代码问题,也可能不会检测到。 Ctrl+Alt+S 您还可以使用 代码清理修复这些检查检测到的问题。
添加括号以避免不明显的优先级 | |
为静态成员添加/移除限定符 | |
添加/移除 'this.' 限定符 | |
调整修饰符声明顺序 | |
调整空值检查模式 | |
在部分中合并或分离属性 | |
在解构声明中合并或分离 'var' | |
将赋值表达式放入代码块中 | |
移除冗余的括号 | |
将内置类型引用替换为 CLR 类型名称或关键字 | |
在静态成员访问表达式中将内置类型引用替换为 CLR 类型名称或关键字 | |
用空行分隔控制转移语句 | |
行尾不必要的空格 | |
禁止使用制表符进行缩进 | |
为类型成员使用显式或隐式修饰符定义 | |
为类型使用显式或隐式修饰符定义 | |
使用首选参数样式 | |
对匿名函数使用首选参数样式 | |
对字面值使用首选参数样式 | |
对命名表达式使用首选参数样式 | |
对字符串字面值使用首选参数样式 | |
使用首选主体样式(转换为具有首选主体样式的构造函数或析构函数) | |
使用首选主体样式(转换为具有首选主体样式的局部函数) | |
使用首选主体样式(转换为具有首选主体样式的方法或运算符) | |
使用首选主体样式(转换为具有首选主体样式的属性、索引器或事件) | |
使用首选的大括号样式(在 'do-while' 语句中强制使用大括号) | |
使用首选大括号样式(在 'fixed' 语句中强制使用大括号) | |
使用首选的大括号样式(在 'for' 语句中强制使用大括号) | |
使用首选大括号样式(在 'foreach' 语句中强制使用大括号) | |
使用首选的大括号样式(在 'if' 语句中强制使用大括号) | |
使用首选大括号样式(在 'lock' 语句中强制使用大括号) | |
使用首选大括号样式(在 'using' 语句中强制使用大括号) | |
使用首选的大括号样式(在 'while' 语句中强制使用大括号) | |
使用首选的大括号样式(移除多余的大括号) | |
使用首选命名空间主体样式 | |
对丢弃声明使用首选样式 | |
在多行列表中,在新行前的尾随逗号使用首选样式 | |
当最后一个元素后没有新行时,对尾随逗号使用首选样式 | |
当类型显而易见时,对默认值表达式使用首选样式 | |
当类型不显而易见时,对默认值表达式使用首选样式 | |
当创建的类型显而易见时,对 'new' 表达式使用首选样式 | |
当创建的类型不显而易见时,对 'new' 表达式使用首选样式 | |
使用首选的 'var' 风格(其他地方) | |
使用首选的 'var' 风格(针对内置类型) | |
使用首选的 'var' 风格(在解构声明中) | |
使用首选的 'var' 风格(当类型简单时) |
Unity(48 项检查)
此类别中的检查报告特定于 Unity 项目的代码问题。
有可用的非分配方法替代 | |
避免在从 'PropertyDrawer' 派生的类中使用 'base.OnGUI()' | |
无法解析组件或可脚本化对象 | |
DOTS:IAspect 字段必须是以下类型之一:RefRW、RefRO、EnabledRefRW、EnabledRefRO、DynamicBuffer 或 Entity | |
DOTS:类型关键字不一致 | |
DOTS:指定的类型必须是结构类型 | |
事件函数名称已被声明 | |
期望类型派生自 'Component' 或 'MonoBehaviour' | |
期望类型派生自 'ScriptableObject' | |
'ComponentLookup' 类型的字段在使用前必须更新。 | |
文件名应与程序集名称匹配 | |
未定义组路径 | |
方法签名不正确 | |
Odin 的组属性类型不正确 | |
成员同时出现在多个 UI 组中 | |
字符串文字中引用的方法不具有预期的签名 | |
'MonoBehaviour' 实例必须使用 'GameObject.AddComponent<T>()' 而不是 'new' 进行实例化 | |
参数应派生自 'Component' | |
可能错误地将属性应用于多个字段 | |
可能无意中绕过了底层 Unity 引擎对象的生命周期检查(对派生自 'UnityEngine.Object' 的类型进行空合并操作会绕过底层 Unity 引擎对象的生命周期检查) | |
可能无意中绕过了底层 Unity 引擎对象的生命周期检查(对派生自 'UnityEngine.Object' 的类型进行空传播操作会绕过底层 Unity 引擎对象的生命周期检查) | |
可能无意中绕过了底层 Unity 引擎对象的生命周期检查(对派生自 'UnityEngine.Object' 的类型进行模式匹配空检查会绕过底层 Unity 引擎对象的生命周期检查) | |
优先使用基于 GUID 的程序集引用 | |
冗余的属性使用(将属性应用于此声明类型时是多余的) | |
冗余的属性使用(冗余的 'FormerlySerializedAs' 属性) | |
冗余的属性使用(冗余的 'HideInInspector' 属性) | |
冗余的属性使用(冗余的 'InitializeOnLoad' 属性) | |
冗余的属性使用(冗余的 'SerializeField' 属性) | |
冗余的 Unity 事件函数 | |
对内置组件的属性重复访问效率低下 | |
场景不存在 | |
场景在构建设置中被禁用 | |
'ScriptableObject' 实例必须使用 'ScriptableObject.CreateInstance<T>()' 而不是 'new' 进行实例化 | |
在对象实例化后立即设置 'parent' 属性效率低下 | |
简短的场景名称不唯一 | |
基于字符串的图形属性查找效率低下 | |
基于字符串的组件类型查找效率低下 | |
SystemApi.Query<...> 类型参数必须是 Aspect、RefRO 或 RefRW | |
索引在构建设置中缺失 | |
输入名称未在输入管理器中定义 | |
图层未在 'Tags & Layers' 中定义 | |
资源未在项目中定义 | |
相同的快捷键已为另一个菜单项定义 | |
标签未在 'Tags & Layers' 中定义 | |
项目中没有具有相同名称的动画器状态。 | |
构建设置中没有具有相同名称的场景 | |
要在函数中使用 'GetSingleton' 调用的结果,'OnCreate' 必须包含 'RequireForUpdate' 调用 | |
使用 'CompareTag' 替代显式字符串比较 |
Unity Burst 编译器警告(17 项检查)
此类别中的检查会报告 Unity Burst Compiler 在代码实际编译之前的警告。
不支持访问托管索引器 | |
不支持访问托管方法 | |
不支持装箱操作 | |
Burst:String.Format(format, ...) 参数类型无效 | |
Burst:变量解析为 System.String,这可能导致在 Burst 编译的调用堆栈中调用无效的托管方法 | |
不支持创建托管类型 | |
调试日志函数仅接受字符串 | |
函数签名不能包含托管类型 | |
从非只读静态字段加载是不支持的 | |
加载托管类型是不支持的 | |
共享静态类型参数需要非托管约束 | |
某些 SharedStatic`1.GetOrCreate 重载会导致编译器错误 | |
String.Format(format, ...) 仅接受字符串字面量和常量字符串 | |
'foreach' 结构是不支持的 | |
Try 语句是不支持的 | |
在 Burst 中禁止使用 typeof | |
写入静态字段是不支持的 |
Unity 性能检查(5 项检查)
此类别中的检查报告 Unity 项目中的计算效率低下的模式。
Unreal Build System(2 项检查)
此类别中的检查特定于 Unreal Engine 项目。
项目文件中缺少插件的依赖项 | |
不存在具有此名称的模块 |
Xunit(1 项检查)
这些检查会检测与 xUnit.Net 测试相关的代码问题。
Xunit 测试中的控制台输出 |