新的.NET运行时是否会抛出更有意义的空引用异常?

t3c*_*b0t 2 .net c# runtime exception c#-6.0

我们知道.NET运行时在抛出异常时不是很有用,因为它只显示通用消息而没有指示任何变量或参数名称.但它能以不同的方式做到吗?

例如,在这种情况下:

class foo
{
    public void bar() {}
}

foo f = null;
f.var(); // NullReferenceException
Run Code Online (Sandbox Code Playgroud)

但是,由于C#6,如果我们使用new ?运算符,编译器能够生成不同的代码,因此它能够检查是否f为null;

f?.var(); 
Run Code Online (Sandbox Code Playgroud)

它不能用类似的null检查来包装调用,比如使用?和获取名称f并创建一个类似的exeption消息

附加信息:对象引用"Foo类型的f"未设置为对象的实例.

是否有可能将它也用于其他的行为类型并在那里放置有意义的信息,或者无论这意味着它是否过于昂贵?

Sri*_*vel 11

不,如果可以的话,他们会做到的.布拉德·亚当斯(Brad Adams)在2004年发表了关于它的博客

发生NullReferenceException是因为像"call [eax + 44]"或"mov edx,[esi + 24]"这样的指令导致了访问冲突.我们没有保留足够的信息来形成特定EIP中特定寄存器为NULL的对应关系以及应用程序中的特定引用为空的事实.特别是因为EIP可能位于共享助手中,如写屏障例程或数组助手.在这些情况下,我们必须执行有限的堆栈遍历才能获得有效的EIP.

改善此错误消息所需的机制非常庞大.在可预见的将来,您将不得不依赖于调试器,或者在FX代码上明确检查并抛出适当的NullArgumentException.

正如您所看到的,可用于提供有意义的错误消息的信息非常少,而且创建机制也需要花费很多精力.不太可能你会在.Net中看到这个功能.