2013-07-16 22 views
26

EDIT:この1つはDelegate.CreateDelegateでの作業の実用的な例であり、他方はILについて理論的な議論であるように、これは、このquestionの複製ではありません。これとヌルの言葉の他に、お互いをやり遂げるものは何もない。これはどのようにすることができます== null?

このquestion ...

への相対的な私は、イベントハンドラがnullであるインスタンス上で呼び出された状況があります。奇妙な。画像を見て:

enter image description here

私は何が起こっているか理解していません。ヌルインスタンスでインスタンスメソッドを呼び出す方法

+0

多分、メソッドはそのクラスによって実装されているインターフェイスからですか? – pythonian29033

+3

すでにガベージコレクションされていますか?使用後にイベントハンドラの登録を忘れた可能性があります。 – Marcel

+0

おそらくハンドラが属するオブジェクトが破棄されましたが、ハンドラはまだどこかのイベントにアタッチされていますか? – mao47

答えて

32

呼び出しのターゲットにnullリファレンスを提供する場合は、Delegate.CreateDelegateオーバーロードを使用してこのケースを作成できます。そのページ上のMSDNの発言から

class Foo 
{ 
    public void Method() 
    { 
     Console.WriteLine(this == null); 
    } 
} 

Action<Foo> action = (Action<Foo>)Delegate.CreateDelegate(
    typeof(Action<Foo>), 
    null, 
    typeof(Foo).GetMethod("Method")); 

action(null); //prints True 

firstArgumentがnull参照とメソッドがインスタンスメソッドである場合、 結果はデリゲート型タイプのシグネチャに依存し のメソッド: メソッドの明示的に隠された最初の パラメータが型のシグネチャに含まれている場合、その代理人は開いている インスタンスメソッドを表す。デリゲートが呼び出されると、 の引数リストの最初の引数が メソッドの隠しインスタンスパラメータに渡されます。方法およびタイプ一致の署名は(つまり、 タイプに互換性があるすべてのパラメータが)、次いでデリゲートが null参照にわたって閉鎖されていると言われる場合

•。デリゲートを呼び出すのは、ヌルインスタンスのインスタンス メソッドを呼び出すのと同じです。これは、 に特に有用なものではありません。

だから、それが知られているように、文書化、およびおそらくは、行動をを意図しています。

+1

+1いい仕事が見つかりました! –

+0

絶対に良い、これは私が他人のコードを使ってやっていたことです...奇妙です。 –

+3

これは許されているのはとても奇妙だと思います。私は 'Delegate.CreateDelegate'がこのシナリオで例外をスローすることを期待していました。私はインスタンスなしでインスタンスメソッドを呼びたいと思う単一のユースケースを考えることはできません... –

関連する問題