c# - 为什么 NullReferenceException 不包含有关什么是 null 的信息?

标签 c#

NullReferenceException 不包含除基类数据(如堆栈跟踪)之外的任何运行时特定信息的设计决策是什么?是否有 Visual Studio 的扩展可以直接告诉您表达式的哪一部分为空?

最佳答案

NRE 是一个非常低级的异常。这是处理器在被要求从低于 64K 的地址读取数据时产生的硬件异常(“陷阱”)。虚拟内存空间的该区域始终未映射,专门用于捕获指针错误。它以 AccessViolation 开始,本地址小于 0x00010000 时由 CLR 变成 NRE。那时异常的上下文非常少,所知道的只是导致陷阱的机器代码指令的地址。

不可能将该机器代码指令地址反向工程回程序中的命名变量。它以这种方式工作很重要,否则抖动将不得不生成非常低效的代码。可以合理地做的就是恢复源代码行号。这需要包含行号信息的调试信息(.pdb)。 CLR 知道如何读取 .pdb 文件并使用它来生成异常的堆栈跟踪。然而,由于 JIT 优化器执行的优化,这通常仍然不准确,它移动代码。您只会获得与调试版本的保证匹配。发布版本的 PDB 不包含源代码行号信息的原因。你可以改变它。

这个问题有一个非常简单的解决方案。在让运行时执行之前,您自己检查 null 并生成您自己的异常。测试非常便宜,不到一纳秒。

关于c# - 为什么 NullReferenceException 不包含有关什么是 null 的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30385519/

相关文章:

c# - 让设备在网络中找到对方的最简单方法(找到它的 IP)C#?

c# - 如何在C#中使用函数存储字符串

c# - C# mysql command.ExecuteNonQuery 返回什么?如果是删除操作

c# - 返回 JSON 数组中的第二个变量

c# - 从有效负载 ID 获取许可证

c# - 如何以编程方式在 .NET Web 服务的 IIS 中设置集成 Windows 身份验证?

c# - 雾与 c# 统一

c# - 批量插入未保存到数据库

c# - 在 .Net C# 中将 MS word 文件转换为图像

c# - List.Contains 未按预期工作