无用的 ?? 表达式¶
ID: cs/coalesce-of-identical-expressions
Kind: problem
Security severity:
Severity: error
Precision: medium
Tags:
- maintainability
- language-features
- external/cwe/cwe-561
Query suites:
- csharp-security-and-quality.qls
编写一个左右操作数都执行相同操作的 null 合并表达式的情况很少见,但并非不可能。其后果通常是灾难性的 - 由于 null 合并表达式通常用于在变量为 null 时执行特殊操作,因此未能处理该(显然是预期)情况通常会导致 NullReferenceException
,无论是在程序执行的立即还是稍后阶段。
建议¶
重写 null 合并表达式的 else
部分,以便在变量为 null 时提供合适的替代项。
示例¶
此示例演示了一个旨在生成随机数的简单类。其核心是一个名为 generator
的 Random
实例。为了提高效率,程序员选择在首次需要之前不初始化生成器。由于 null 合并表达式的两侧都相同,因此 generator
永远不会被初始化,并且在尝试调用 Next
时会发生 NullReferenceException
。
class UselessNullCoalescingExpression
{
private static Random generator;
private static int RandomNumber()
{
// This should probably have said "generator ?? new Random()".
generator = generator ?? generator;
return generator.Next();
}
static void Main(string[] args)
{
Console.WriteLine(RandomNumber());
Console.WriteLine(RandomNumber());
Console.WriteLine(RandomNumber());
}
}