this
インスタンスメソッド本体内で が null になることは不可能だといつも思っていました。次の簡単なプログラムは、それが可能であることを示しています。これは文書化された動作ですか?
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# の設計方法ではないためです。
Null ポインターでメソッドを呼び出すコードを書いた誰か (おそらく C# を使用している .NET グループの 1 つ (当時はまだ C# という名前ではなかったと思われます)) からレポートを受け取りましたが、彼らは取得しませんでした。メソッドがどのフィールドにもアクセスしなかったため、例外が発生しました (つまり、「this」は null でしたが、メソッドでは何も使用されませんでした)。そのメソッドは、this ポイントを使用する別のメソッドを呼び出して例外をスローし、頭を悩ませました。彼らがそれを理解した後、彼らは私たちにそれについてのメモを送った. null インスタンスでメソッドを呼び出すことができるのは少し奇妙だと思いました。Peter Golde は、常に callvirt を使用した場合のパフォーマンスへの影響を確認するためにいくつかのテストを行いました。
http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx