考虑以下代码:
A a = null;
a.f(); //Will it throw NullReferenceException?
以上代码会抛出
NullReferenceException
吗?答案是:这取决于
f()
是什么。- 如果它是成员方法,则是的,它会抛出异常。 - 如果它是扩展方法,则不会抛出任何异常。
这种差异引发了一个问题:每种类型的方法如何被C#编译器实现和查看?此外,为什么即使成员方法不访问任何成员数据,它也必须抛出异常?似乎C#编译器提前做出了一个假设,即成员方法将访问成员数据,因此如果对象为空,它就会抛出异常,因为使用空对象无法访问成员数据。但是,在扩展方法的情况下,它会推迟此决定,直到它尝试使用空引用访问成员数据时,然后才会抛出异常。
我的理解有多正确?如果是这样,为什么会有这种差异?
是的,我知道如果
f()
是扩展方法,则a.f()
等同于编写AExt.f(a)
,因此后者在使用a
访问成员之前不应抛出异常。但我的重点主要是编译器实现(甚至可以以相同的方式实现成员方法)。
.IsNullOrEmpty
方法成为可能,从而允许s.IsNullOrEmpty()
。 - Kirk Wolls.IsNullOrEmpty()
是正确的吗?难道不应该是string.IsNullOrEmpty(s)
吗?我认为你写的代码甚至无法编译! - NawazIsNullOrEmpty(this string s)
,那么它就会起作用。 - svick