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/4719047/

相关文章:

C# 可以给类起别名吗(不是 'using' )

c# - 在不同的配置中引用不同的程序集

c# - XmlSchema 删除重复类型

c# - 将对象数组从 C# 返回到 COM 中的 C

c# - 序列化 DataContract 和 NULL 数据成员

c# - 将此 XML 文档转换为我的对象的最简单方法是什么?

c# - C 无符号 `char ** out` 到 C# `byte[]`

c# - 在 C# 中使用异常抛出。对性能有影响吗?

c# - 在 Visual Studio 中启用 SSL - 未提示安装证书

c# - (过山车/运输大亨)地形的生成