为什么甚至像 C# 或 Java 这样的高级语言也不能轻松地提供一种机制来查找哪个对象类型和实例(变量)为空?我们是否需要为此编写自定义逻辑。
ex: SampleClass sc = null;
sc.SomeMethod();
我想说“SampleClass 类型的对象 sc 为空”而不是天真的异常消息“对象引用未设置为对象的实例”。
为什么甚至像 C# 或 Java 这样的高级语言也不能轻松地提供一种机制来查找哪个对象类型和实例(变量)为空?我们是否需要为此编写自定义逻辑。
ex: SampleClass sc = null;
sc.SomeMethod();
我想说“SampleClass 类型的对象 sc 为空”而不是天真的异常消息“对象引用未设置为对象的实例”。
这里的术语值得明确。sc
不是对象,是变量。变量的值是一个参考。引用可能为空,也可能是对真实对象的引用。
现在,至于为什么它不像听起来那么简单......
在这段代码中:
sc.SomeMethod();
...有两个操作:
sc
到执行堆栈上SomeMethod
堆栈上的引用执行这是第二次失败的操作,并且该操作实际上并不“知道”第一次操作。
当涉及更多操作时,情况会变得更糟。关于什么:
Foo().Bar().SomeMethod()
在这种情况下,您希望异常显示什么?
就我个人而言,我很少发现很难弄清楚异常的来源 - 行号通常可以很清楚地说明,而不清楚的情况通常正是存在无法轻易给出的长表达式的情况无论如何,在异常中只有一个答案。
我想CLR/编译器有可能就一个额外的表达成一致,比如行号映射,它表示“对于 IL 指令 X,执行堆栈的顶部来自带有诊断消息 Y 的表达式”。感觉它会很麻烦 - 正如我所说,它不应该真的让你那么头疼。
因为在大多数情况下,事情并没有那么简单。
以这种方法为例:
public int Foo(string bar)
{
return bar.Length;
}
bar
可能null
取决于仅在运行时知道的因素。这是编译器无法验证的。