Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Temsilci, C ve C++ içindeki işlev işaretçisine benzer şekilde bir yöntemi güvenli bir şekilde kapsülleyen bir türdür. C dilindeki işlev göstergelerinden farklı olarak, temsilci fonksiyonlar nesne odaklı, tür açısından güvenli ve güvenlidir. Aşağıdaki örnek, bir Callback
bağımsız değişken olarak alan ve void döndüren bir yöntemi kapsülleyebilecek adlı bir temsilci bildirir:
public delegate void Callback(string message);
Temsilci nesnesi normalde temsilcinin sarmaladığı yöntemin adı sağlanarak veya bir lambda ifadesiyle oluşturulur. Temsilci bu şekilde örneklendirildikten sonra çağrılabilir. Bir temsilciyi çağırmak, temsilci örneğine eklenen yöntemi çağırır. Çağrıyıcı tarafından temsilciye aktarılan parametreler yönteme iletilir. Temsilci, varsa yönteminden dönüş değerini döndürür. Örneğin:
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
Console.WriteLine(message);
}
// Instantiate the delegate.
Callback handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
.NET'teki Delegate sınıfından türetilen Temsilci türleridir. Temsilci türleri mühürlüdür, türetilemez ve Delegateözel sınıflar türetmek mümkün değildir. Örneklenmiş bir temsilci bir nesne olduğundan, bağımsız değişken olarak geçirilebilir veya bir özelliğe atanabilir. Bir yöntem bir temsilciyi parametre olarak kabul edebilir ve daha sonra temsilciyi çağırabilir. Bu, zaman uyumsuz geri çağırma olarak bilinir ve uzun bir işlem tamamlandığında çağıranı bilgilendirmenin yaygın bir yöntemidir. Bir temsilci bu şekilde kullanıldığında, temsilciyi kullanan kodun kullanılan yöntemin uygulanması hakkında herhangi bir bilgiye ihtiyacı yoktur. İşlev, kapsülleme arabirimlerinin sağladığına benzer.
Geri çağırmaların bir diğer yaygın kullanımı, özel bir karşılaştırma yöntemi tanımlamak ve bu temsilciyi bir sıralama yöntemine geçirmektir. Çağıranın kodunun sıralama algoritmasının bir parçası olmasını sağlar. Aşağıdaki örnek yöntem, türünü parametre olarak kullanır Del
:
public static void MethodWithCallback(int param1, int param2, Callback callback)
{
callback("The number is: " + (param1 + param2).ToString());
}
Ardından, önceki örnekte oluşturulan temsilciyi bu yönteme geçirebilirsiniz:
MethodWithCallback(1, 2, handler);
Konsolda aşağıdaki çıktıyı alın:
The number is: 3
MethodWithCallback
doğrudan konsol çağrılması gerekmez; konsola yönelik tasarlanması gerekmez.
MethodWithCallback
'ın yaptığı şey, bir dize hazırlayıp bu dizeyi başka bir yönteme iletmektir. Temsilci olarak atanan bir yöntem herhangi bir sayıda parametre kullanabilir.
Bir örnek yöntemini sarmalamak için bir temsilci oluşturulduğunda, temsilci hem örneğe hem de yönteme başvurur. Bir temsilci, sardığı yöntemin dışında örnek türü hakkında bilgi sahibi değildir. Temsilci, bu nesnede temsilci imzası ile eşleşen bir yöntem olduğu sürece herhangi bir nesne türüne başvurabilir. Bir temsilci statik bir yöntemi sarmalamak için oluşturulduğunda, yalnızca yöntemi referans alır. Aşağıdaki bildirimleri göz önünde bulundurun:
public class MethodClass
{
public void Method1(string message) { }
public void Method2(string message) { }
}
Daha önce gösterilen statik DelegateMethod
ile birlikte artık bir Del
örnekte sarmalayabileceğiniz üç yöntemimiz var.
Bir temsilci çağrıldığında, çoklama olarak adlandırılan birden fazla yöntemi çağırabilir. Temsilcinin yöntem listesine (çağırma listesi) ek bir yöntem eklemek için, toplama veya ekleme atama işleçlerini ('+' veya '+=' kullanarak iki temsilci eklenmesi yeterlidir. Örneğin:
var obj = new MethodClass();
Callback d1 = obj.Method1;
Callback d2 = obj.Method2;
Callback d3 = DelegateMethod;
//Both types of assignment are valid.
Callback allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;
çağrısı allMethodsDelegate
listesinde üç yöntem içerir:Method1
, Method2
ve DelegateMethod
. Özgün üç temsilci ( d1
, d2
ve d3
) değişmeden kalır. Çağrıldığında allMethodsDelegate
, üç yöntem de sırayla çağrılır. Temsilci başvuru parametrelerini kullanıyorsa, başvuru sırayla üç yöntemin her birine sırayla geçirilir ve bir yöntemle yapılan tüm değişiklikler sonraki yönteme görünür. Yöntemlerden herhangi biri yönteminde yakalanmamış bir özel durum oluşturursa, bu özel durum temsilcinin çağırana geçirilir. Çağırma listesindeki sonraki hiçbir yöntem çağrılmaz. Temsilcinin dönüş değeri ve/veya out parametreleri varsa, çağrılan son yöntemin dönüş değerini ve parametrelerini döndürür. Bir yöntemi çağırma listesinden kaldırmak için çıkarma veya çıkarma atama işleçlerini (-
veya -=
) kullanın. Örneğin:
//remove Method1
allMethodsDelegate -= d1;
// copy AllMethodsDelegate while removing d2
Callback oneMethodDelegate = (allMethodsDelegate - d2)!;
Temsilci türleri öğesinden System.Delegate
türetildiğinden, bu sınıf tarafından tanımlanan yöntemler ve özellikler temsilcide çağrılabilir. Örneğin, bir temsilcinin çağırma listesinde yöntem sayısını bulmak için şunları yazabilirsiniz:
int invocationCount = d1.GetInvocationList().GetLength(0);
Birden fazla metot içeren çağrı listesine sahip temsilciler, MulticastDelegatein alt sınıfı olan System.Delegate
den türetilir. Yukarıdaki kod her iki durumda da çalışır çünkü her iki sınıf da öğesini destekler GetInvocationList
.
Çok noktaya yayın temsilcileri olay işlemede geniş ölçüde kullanılır. Olay kaynağı nesneleri, bu olayı almak üzere kaydedilen alıcı nesnelerine olay bildirimleri gönderir. Bir olaya kaydolmak için, alıcı olayı işlemek üzere tasarlanmış bir yöntem oluşturur, ardından bu yöntem için bir temsilci oluşturur ve temsilciyi olay kaynağına geçirir. Olay gerçekleştiğinde kaynak temsilciyi çağırır. Daha sonra temsilci, olay verilerini alıcıya ileterek alıcıdaki olay işleme metodunu çağırır. Olay kaynağı, belirli bir olay için temsilci türünü tanımlar. Daha fazla bilgi için bkz . Olaylar.
Derleme zamanında atanan iki farklı türdeki temsilcilerin karşılaştırılması bir derleme hatasıyla sonuçlanır. Delegat örnekleri statik olarak System.Delegate
türündeyse, karşılaştırma yapılmasına izin verilir ancak çalışma zamanında false döndürülür. Örneğin:
delegate void Callback1();
delegate void Callback2();
static void method(Callback1 d, Callback2 e, System.Delegate f)
{
// Compile-time error.
Console.WriteLine(d == e);
// OK at compile-time. False if the run-time type of f
// is not the same as that of d.
Console.WriteLine(d == f);
}