2011-01-09 7 views
17

Bir temsilci beyanının bunun gibi bir şey olduğunu anlıyorum:.NET'te bir temsilci iç uygulama nedir?

public delegate int PerformCalculation(int x, int y); 

Ancak, daha fazla olması gerekir. Temsilcinin amacı, bir yönteme bir işaretçi sağlamak ve temsilci içindeki yönteme başvuruyu kapsüllemek için yapmaktır.

Bu referans (içte delege içinde) yapılan bu yapı nedir? Ayrıca, bir temsilci içinde birden çok yönteme başvuruda bulunabileceğinizi anlıyorum. Bu, delege içinde bunları tutan bir dizi olduğu anlamına mı geliyor?

Ayrıca, delege vb. yöntemlerde hangi yöntemler tanımlanır? Gerçekten bir temsilci bildirdiğinizde neler oluyor:

public delegate int PerformCalculation(int x, int y); 

?

DÜZENLEME: Bazı açıklamalar. Bir temsilci bildirdiğinizde, derleyici otomatik olarak sizin için System.MulticastDelegate öğesinden devraldığı bir kapalı sınıfı oluşturur. Meclise ildasm ile bakarsan bunu görebilirsin. Bu temiz. Temel olarak, bir deyimle, derleme zamanında sizin için oluşturulan tamamen yeni bir sınıf elde edersiniz ve ihtiyacınız olan tüm işlevlere sahiptir.

+8

Birçoğunu reflektörle kontrol edebilirsiniz. Runtime-magic gerektirdiği için bazı kısımlar eksik. Ancak yine de tek ve çok noktaya yayın delegelerinin çoğunun içeriğini göreceksiniz. – CodesInChaos

cevap

8

Tüm delegeler, Target ve Method numaralarını tutan System.Delegate türünden devralır. Daha doğrusu, System.Delegate'dan gelen System.MultiCastDelegate'dan miras alırlar.

+2

Teşekkürler! Tam olarak aradığım şey buydu. Kendimi bulamadığım için kendimi aptal hissediyorum. Temsilcinin birden çok başvuruyu nasıl tuttuğunu göremiyorum. Bir hedefi ve bir yöntemi var, ama bunlar koleksiyonlara benzemiyor. . . Burada neyi özlüyorum? – richard

+0

@Richard DesLonde, tüm delege devraldığı [System.MulticastDelegate] (http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx) eksik. Cevabımı daha fazla netlik için güncelledim. –

+2

Uygulamıyorlar - miras alıyorlar. – Ani

18

Dahili olarak, bir sınıfa oldukça benzer bir referans türüdür. Transkript o şuna benzer:

public /* delegate */ class PerformCalculation : MulticastDelegate { 
    public PerformCalculation(object target, IntPtr method) {} 
    public virtual void Invoke(int x, int y) {} 
    public virtual IAsyncResult BeginInvoke(int x, int y, AsyncCallback callback, object state) {} 
    public virtual void EndInvoke(IAsyncResult result) {} 
} 

ben bu üyelerin uygulamaları boş bıraktı, aslında CLR kodu eşlenir. Derleyici, temsilci bildiriminin imzasına bağlı olarak yöntem imzalarını dinamik olarak oluşturur. X ve y değişkenlerini not edin. JIT derleyicisi, + = veya - = sözdizimini kullanarak çağrılan kurucuyu almasına yardımcı olur, temsilci hedef yönteminin bellek adresini bilir. Derleyici, hedef yöntemin statik olup olmadığına bağlı olarak hedef argüman değerini otomatik olarak oluşturdu. İki argüman (Multicast) Delegate.Target ve Yöntem özelliklerine eşleşir. Gerçek temel sınıf örneği, kaç hedefin abone olduğuna bağlı olarak Delege veya Çok NoktalıDelegat olabilir.

Burada bir sürü gizli sos var.

+0

İyi şeyler. Bir temsilci çağrısıyla ilgili ek yükü açıklayabilir misiniz? Özellikle, bir sanal yöntem çağrısı. – Ani

+2

Anlatmak zor, hata ayıklayıcı * çok * bu kodun hata ayıklaması hakkında huysuzdur. Kesinlikle havai bir şey var, basit bir sanal yöntem çağrısı değil. Afaict, daha sonra bir temsilci veya bir MulticastDelegate bağlı olarak, yığın çerçeve masaj ve doğru invoker çağırır bir thunk için dolaylı bir çağrı yapmak jitted Invoke() yöntemini çağırır. İkincisi, çağrı listesini tekrarlamak zorundadır. Ben profilli (nanosaniye), ancak sadece bir yöntem çağrısı kadar ucuz değil, oldukça ucuz. –

+0

Teşekkürler Hans. İç şeyler çok yararlı ve ilginç. – richard

İlgili konular