如何告知C#静态分析器方法可保证变量非空的后置条件?
解决C#静态代码分析器的非空后置条件提示问题
针对你提到的两个场景,都可以通过System.Diagnostics.CodeAnalysis命名空间下的属性来告知静态代码分析器方法的非空保证:
1. 针对ThrowIfNullOrWhitespace这类校验扩展方法
给方法的参数标记[NotNull]属性,就能让分析器知道:只要方法正常执行完成(不抛出异常),该参数一定是非空的。修改后的代码如下:
[System.Diagnostics.StackTraceHidden] public static void ThrowIfNullOrWhitespace( [System.Diagnostics.CodeAnalysis.NotNull] this string? stringValue, Exception exception) { if (string.IsNullOrWhiteSpace(stringValue)) throw exception; }
调用这个方法后,后续使用foo时,编辑器就不会再弹出“可能为空值”的提示了。
2. 针对foo = DoSomething(foo)这类返回非空结果的方法
给DoSomething方法的返回值标记[return: NotNull]属性,明确告诉分析器该方法的返回值永远非空:
using System.Diagnostics.CodeAnalysis; // 标记返回值非空 [return: NotNull] public static string DoSomething(string? input) { // 内部逻辑保证返回非空字符串 return input ?? "default_value"; }
当你执行foo = DoSomething(foo)后,分析器会自动识别foo现在是非空的,不会再出现空值提示。
如果是实例方法需要保证自身实例非空(比如修改内部状态后确保实例有效),还可以使用[MemberNotNull]属性标记方法,指定要保证非空的成员。
内容的提问来源于stack exchange,提问作者BJ Safdie
相关产品推荐
相关产品推荐

