Temsilci (CLI) - Delegate (CLI)

Bir temsilci bir şeklidir türü için güvenli işlev işaretçisi tarafından kullanılan ortak dil Altyapısı (CLI). Temsilciler, çağırılacak bir yöntemi ve isteğe bağlı olarak yöntemin çağrılacağı bir nesneyi belirtir . Temsilciler, diğer şeylerin yanı sıra geri aramaları ve olay dinleyicilerini uygulamak için kullanılır . Temsilci nesne, bir yönteme bir başvuruyu kapsüller. Temsilci nesnesi daha sonra hangi yöntemin çağrılacağını derleme zamanında bilmek zorunda kalmadan başvurulan yöntemi çağırabilen koda geçirilebilir .

Çok noktaya yayın temsilcisi , birkaç yöntemi işaret eden bir temsilcidir. Çok noktaya yayın yetkilendirme, birden fazla yöntemi yürütmek için işlevsellik sağlayan bir mekanizmadır. Dahili olarak tutulan delegelerin bir listesi vardır ve çok noktaya yayın delegesi çağrıldığında, delegelerin listesi yürütülür.

C # 'da, temsilciler genellikle olay güdümlü programlamada geri aramaları uygulamak için kullanılır. Örneğin, kullanıcı bir düğmeye tıkladığında hangi yöntemin çağrılması gerektiğini belirtmek için bir temsilci kullanılabilir. Temsilciler, programcının bir olayın meydana geldiğini birkaç yöntemi bildirmesine izin verir.

C # kod örneği

Parametre olarak a alan ve şunu döndüren delegate , adlandırılmış bir türü bildiren kod : SendMessageDelegateMessagevoid

delegate void SendMessageDelegate(Message message);

Bağımsız değişken olarak örneklenmiş bir temsilciyi alan bir yöntemi tanımlama kodu:

void SendMessage(SendMessageDelegate sendMessageDelegateReference)
{
    // Call the delegate and any other chained delegates synchronously.
    sendMessageDelegateReference(new Message("hello this is a sample message"));
}

Temsilci çağrıldığında çalışan uygulanan yöntem:

void HandleSendMessage(Message message)
{
    // The implementation for the Sender and Message classes are not relevant to this example.
    Sender.Send(message);
}

SendMessage yöntemini çağırmak için kod, başlatılmış bir temsilciyi bağımsız değişken olarak iletir: Code to call the SendMessage method, pass an instantiated delegate as an argument:

SendMessage(new SendMessageDelegate(HandleSendMessage));

Temsilciler (C #)

delegate void Notifier(string sender);  // Normal method signature with the keyword delegate

Notifier greetMe;                       // Delegate variable

void HowAreYou(string sender) {
    Console.WriteLine("How are you, " + sender + '?');
}

greetMe = new Notifier(HowAreYou);

Temsilci değişken ilişkili yöntemi çağırır ve şu şekilde çağrılır:

greetMe("Anton");                       // Calls HowAreYou("Anton") and prints "How are you, Anton?"

Temsilci değişkenler , formun birinci sınıf nesneleridir ve herhangi bir eşleşen yönteme veya değere atanabilir . Bir yöntemi ve alıcısını herhangi bir parametre olmadan saklarlar : new DelegateType(obj.Method)null

new DelegateType(funnyObj.HowAreYou);

Nesne funnyObj olabilir this ve ihmal edilebilir. Yöntem ise static , nesne (diğer dillerde örnek olarak da adlandırılır) değil, sınıfın kendisi olmalıdır. Bu olmamalı abstract ama olabilir new , override ya da virtual .

Başarılı bir temsilci ile bir yöntemi çağırmak için, yöntem imzası eşleşmesi gerekir DelegateType aynı tür (parametreleri aynı sayıda ref , out , value (dönüş türü dahil) aynı tip).

Çok noktaya yayın delegeleri (C #)

Temsilci değişken, aynı anda birden çok değeri tutabilir:

void HowAreYou(string sender) {
    Console.WriteLine("How are you, " + sender + '?');
}

void HowAreYouToday(string sender) {
    Console.WriteLine("How are you today, " + sender + '?');
}

Notifier greetMe;

greetMe = HowAreYou;
greetMe += HowAreYouToday;

greetMe("Leonardo");                  // "How are you, Leonardo?"
                                      // "How are you today, Leonardo?"

greetMe -= HowAreYou;

greetMe("Pereira");                   // "How are you today, Pereira?"

Çok noktaya yayın temsilcisi bir işlevse veya out parametresi yoksa , son çağrının parametresi döndürülür.

Teknik uygulama ayrıntıları

Dahili uygulamalar değişiklik gösterse de, temsilci örnekleri bir nesnenin bir demeti ve bir yöntem işaretçisi ve başka bir temsilciye bir başvuru (muhtemelen boş) olarak düşünülebilir . Dolayısıyla, bir delegeye yapılan atıf, muhtemelen birden fazla delegeye yapılan referanstır. İlk delege bitirdiğinde, zincir referansı boş değilse, sonraki çağrılır ve liste tamamlanana kadar böyle devam eder. Bu model, bir olayın , tek bir referanstan bir delege listesine gönderilmesine kadar kolayca ek yük ölçeklendirmesine izin verir ve CLI'de yaygın olarak kullanılır.

Verim

Temsilcilerin performansı eskiden sanal veya arabirim yöntem çağrısından çok daha yavaştı (Microsoft'un 2003 karşılaştırmalarında 6 ila 8 kat daha yavaştı), ancak 2005'teki .NET 2.0 CLR'den bu yana, arabirim çağrılarıyla hemen hemen aynı. Bu, doğrudan yöntem çağrılarına kıyasla küçük bir ek yük olduğu anlamına gelir.

Delege sınıflarının oluşturulması konusunda çok katı kurallar vardır. Bu kurallar, tür güvenliğini sağlarken delegeleri optimize ederken derleyicilerin optimize edilmesine büyük ölçüde izin verir.

Ayrıca bakınız

Referanslar

Dış bağlantılar