为什么在.NET实例方法中可以出现"this == null"?

19 浏览
0 Comments

为什么在.NET实例方法中可以出现"this == null"?

我一直认为在实例方法体内,this不可能为空。下面的简单程序证明了这是可能的。这是一种已记录的行为吗?

class Foo
{
    public void Bar()
    {
        Debug.Assert(this == null);
    }
}
public static void Test()
{            
    var action = (Action)Delegate.CreateDelegate(typeof (Action), null, typeof(Foo).GetMethod("Bar"));
    action();
}

更新

我同意答案中关于这个方法被记录的说法。然而,我对这种行为并不真正理解。特别是因为这不是C#的设计方式。

我们从某个人(很可能是使用C#的.NET团队之一)那里得到了一个报告,他们编写的代码在空指针上调用了一个方法,但是他们没有得到异常,因为该方法没有访问任何字段(即“this”为null,但是方法中没有使用它)。然后,该方法调用了另一个使用了this指针并抛出了异常的方法,这引起了一些困惑。在他们弄清楚后,他们给我们发了一个说明。

我们认为在空实例上调用方法有点奇怪。Peter Golde进行了一些测试,以了解始终使用callvirt的性能影响,结果影响很小,所以我们决定进行改变。

http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx

0