我一直认为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 小组之一(当时还没有命名为 C#))那里得到了一份报告,他编写了在空指针上调用方法的代码,但他们没有得到一个异常,因为该方法没有访问任何字段(即“this”为空,但方法中没有使用它)。然后那个方法调用了另一个方法,它确实使用了这个点并抛出了一个异常,随之而来的是一些令人头疼的问题。在他们弄清楚之后,他们给我们发了一张关于它的便条。我们认为能够在空实例上调用方法有点奇怪。Peter Golde 做了一些测试,看看总是使用 callvirt 对性能的影响是什么,它足够小,我们决定做出改变。
http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx