C#空引用异常,如何在指定行找出罪魁祸首

C# null reference exception, how to spot the culprit in the specified line

我们都厌倦了这种异常,但有没有办法快速找到违规的东西?通常这种异常会在这样一行抛出:

var myVar = somethingUninitallized.property;

并且很容易看出赋值的右侧是原因。但是有时行会像这样长:

var myVar = x.DoSomething(y.FirstDoThis(isThisInitiallized).aProperty, z.ThenDoThis(whatAboutThis).anotherProperty).ComplicatingThings().thisHappensSometimes;

我们在该行得到了异常。是的,我们可以用不同的方式编写代码,但可能是我们正在调试其他人的代码并修改它需要重新编译 15 分钟、需要授权或任何其他障碍。这是一个微不足道的例子,我也可以在 linq 上思考,但肯定还有其他更复杂的场景。我通常还是在2020年一一检查。

是否无法从调试器工具中获取或以某种方式获取空引用?

这是从 Debugging System.NullReferenceException, writen by Thomas Ardel 复制的答案:


在Visual Studio

中使用空引用分析

如果您使用的是 Visual Studio 2017 或更新版本,您将可以使用空引用分析功能。有了这个,Visual Studio 可以准确地告诉你什么是 null。让我们使用这个方法链接的例子:

var street = service.GetUser().Address.Street;

要启用分析,请转至 调试 | Windows |异常设置。检查公共语言运行时异常(如果尚未检查)或扩展节点并检查您感兴趣的异常。

在这种情况下,您可以检查System.NullReferenceException。当 运行 代码时,调试器在 NullReferenceException 处中断,您现在看到 Exception Thrown window:

瞧! window 表示 "ConsoleApp18.User.Address.get returned null"。正是我们想看到的。