2013-07-16 17 views
26

EDIT EDIT: Bu, question'un bir kopyası değildir; çünkü bu, Delegate.CreateDelegate ile çalışan pratik bir örnektir ve diğeri de IL hakkında teorik bir tartışmadır. Bu ve null kelimelerin dışında birbiriyle bir şey yapamaz. Bir olay işleyicisi null bir örneği çağrıldığında bu question GöreliBu nasıl == null olabilir?

...

Ben bir durum var. Tuhaf. Görüntünün bak:

enter image description here

Ne oluyor anlamıyorum. Bir örnek örneği null örneğinde nasıl çağrılabilir ???

+0

Belki bu yöntem bu sınıf tarafından uygulanan bir arabirimden mi geliyor? – pythonian29033

+3

Zaten çöp toplandığı için mi? Muhtemelen kullanımdan sonra olay işleyicinizi kaydetmeyi unutmuşsunuzdur. – Marcel

+0

belki de işleyicinin ait olduğu nesne bertaraf edilmişti, ancak işleyici hala bir yere bazı olaylara eklenmiş durumda mı? – mao47

cevap

32

Bu durumu, null başvuru hedefi için başvuruda bulunduğunuz Delegate.CreateDelegate aşırı yükünü kullanarak oluşturabilirsiniz. o sayfada MSDN açıklamalar itibaren

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 başvuru ve bir örnek metot ise, sonuç temsilci tür türündeki imzaları ve bağlı

yöntemini kullanın:

• Yazının imzası, gizli ilk yönteminin parametresini içerirse, temsilci söylenir. açık bir örnek yöntemini temsil etmek. Delege çağrıldığında, argümanı listesindeki ilk argüman, yönteminin gizli örnek parametresine iletilir. yöntem ve tür, uyan imzaları (yani, tip uyumlu olan tüm parametre), daha sonra temsilci null başvuru boyunca kapalı olması söz konusu ise

•. Temsilciyi çağırmak, yöntemini null örneğiyle çağırmak gibidir; bu, için özellikle yararlı bir şey değildir.

Yani bilinen bir şekilde belgelenmiş ve muhtemelen , davranış amaçlar.

+1

+1 Bunu bulmak iyi iş! –

+0

Kesinlikle iyi, bu başkasının kodunu kullanarak yaptığım şey ... garip. –

+3

Sanırım buna izin verilmesi çok garip. Delegate.CreateDelegate'in bu senaryoda bir istisna atmasını beklerdim. Örnek bir örnek yöntemini çağırmak isteyebileceğiniz tek kullanımlık bir durum düşünemiyorum ... –

İlgili konular