有没有理由说NullReferenceException没有给出变量的名称?

时间:2011-03-10 09:22:53

标签: .net exception

ArgumentNullException有一个ParamName属性,用于指示哪个参数传递为null。

为什么NullReferenceException没有类似的属性?技术上是否可以在.Net中实施?

2 个答案:

答案 0 :(得分:9)

当CLR尝试导航空引用时,它会抛出NullReferenceException。这不一定与变量相关联,特别是CLR实际上并不关心它来自何处 - 它只是堆栈上的值。

将其与ArgumentNullException进行比较,该if (foo == null) { throw new ArgumentNullException("foo"); } 显式通过以下代码抛出:

{{1}}

这里没有魔法 - 如果你愿意,你甚至可以给出错误的名字。所以他们的情况非常不同。

答案 1 :(得分:1)

好的,我知道Jon已经发布了一个很好的答案,但这里有更多信息。

变量名永远不会编译到IL中。 (我最初不确定,但已经检查过)至于CLR,它只是一个参考,所以它不知道它有什么名称和它甚至不知道它的类型,因为它是一个null从堆上每个对象的类型指针中检索指针和类型信息(获取ValueTypes的类型信息需要装箱)。

但是, Reflector 在对已编译的程序集进行逆向工程并将变量名称放回其中时做得非常好,但是当IL没有变量名的概念时怎么办?事实证明它可以使用写入.pdb文件的元数据来完成它。如果删除该文件,它将为您的变量生成随机名称。