2011-06-17 15 views
10

: - Invoke, BeginInvoke ve EndInvokeDelegate.Invoke nasıl çalışır? Ben gibi benim kodda bir temsilci oluşturursanız

delegate void dostuff (string o); 

Bu üç yöntem uygulayan System.MulticastDelegate türetilmiş bir sınıf oluşturur. Ben Invoke için derlenmiş IL bakarsak

tek gördüğüm geçerli:

.method public hidebysig newslot virtual 
     instance void Invoke(string o) runtime managed 
{ 
} // end of method dostuff::Invoke 

yöntem hiçbir kod içerir. Çağırmak işe yarıyor - temsilci çağırılıyor, ama nasıl olduğunu göremiyorum.

Çağrının çağrılmasını sağlayan voodoo aslında temsilci çağırmak nereden geliyor?

+0

Sadece temelini oluşturan .Net çerçevesinin bir parçası - çağrı * * çağırmak için çağrıdır. 'MyDelegate.Invoke()' 'MyDelegate()' –

+0

ile aynıdır. MyDelegate(), oluşturulan Invoke yöntemine bir çağrı olan MyDelegate.Invoke() için derlenmiş olan sözdizimsel şekerdir. Çağrı için IL sadece * callvirt instance void ConsoleApplication1.Program/dosttur :: Herhangi bir diğer yöntem çağrısından farklı olmayan Invoke (string) *. –

cevap

7

Voodoo imzanın sonunda bulunabilir: runtime managed. Tanımladığınız tüm yönetilen sınıflarınızın ve yöntemlerin, cli managed olarak dekore edileceğine dikkat edin.

runtime managed, çalışma zamanının, yöntemlerin önceden optimize edilmiş uygulamalarını sağladığı anlamına gelir.

+0

Delegenin davranışı var. Çağırma listesinin üzerine geçer - bir temsilci çağırmak için birden çok yöntemi temsil edebilir ve sırayla her yöntemi çağırır. –

+0

Uygulama yönteminin davranışı nasıl geçersiz kılabildiğini göremiyorum. Bu ilginç bir desen, ancak bunun çalışma şeklini gösteren bir kanıt göremiyorum. Ancak çok noktaya yayın delegeleri için işe yaramaz. Delegeyi oluştururken, kesinlikle oluşturulan oluşturulmuş temsilci sınıfıdır ve yapıcısı ona geçirilen yöntemle çağrılır. Burada voodoo yoktur, sadece oluşturulan herhangi bir sınıfın yaratıldığı gibi oluşturulan delegeler sınıfı yaratılır. –

+0

@Mongus, cevabımı güncelledi. Ancak, çağırma listesi üzerinde yinelemek için "davranış", temsilci parçası değil, System.Delegate'nin bir parçası olduğunu unutmayın. –

İlgili konular