2012-11-25 11 views
7

: Son satırda+ operatörü, temsilciler için nasıl çalışır? Örneğin

delegate void SomeDelegate(); 

SomeDelegate a = new SomeDelegate(() => Console.WriteLine("A")); 
SomeDelegate b = new SomeDelegate(() => Console.WriteLine("B")); 

SomeDelegate c = a + b; 

ne a + b olması anlamına geliyor? Ben sadece onları + operatörünü kullanmadan nasıl ekleyeceğimi merak ediyorum.

+0

Bunun geçerli C# kodu olduğunu bilmiyordum. – rekire

+0

@rekire: İlk satır bir fonksiyonun dışında olacak ve bir sonraki 3 de bir tane olacaktır. –

cevap

5

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx - ek arama:

çağrıldığında birden fazla yöntemini çağırabilirsiniz bir temsilci. Bu, çok noktaya yayın olarak adlandırılan . Delegenin yöntem listesine ek bir yöntem eklemek için - çağrı listesi - ekleme veya toplama atama işleçlerini ('+' veya '+ =') kullanarak iki adet delege eklemeyi gerektirir. Örneğin:

MethodClass obj = new MethodClass(); 
Del d1 = obj.Method1; 
Del d2 = obj.Method2; 
Del d3 = DelegateMethod; 

//Both types of assignment are valid. 
Del allMethodsDelegate = d1 + d2; 
allMethodsDelegate += d3; 

Bu noktada allMethodsDelegate onun çağırma liste Yöntem 1, Method2 ve DelegateMethod üç yöntem bulunmaktadır. Orijinal üç delege, d1, d2 ve d3, değişmeden kalır. allMethodsDelegate çağrıldığında, üç yöntem de sırayla çağrılır. Delege, başvuru parametrelerini kullanırsa, başvuru sırası ile üç yöntemin her birine geçirilir ve bir yöntem tarafından bir sonraki yönteme görünür. yöntemlerinden herhangi biri yöntemde yakalanmayan bir istisna atarsa, istisnası delegenin çağrısına iletilir ve sonraki listede hiçbir yöntemi çağrılmaz.

Güncelleme

Hem delegeler System.Delegate den Birlikte iki delege eklemek için combine() yöntem kullanabilirsiniz türetmek.

+0

Evet, ek çalışmayı biliyorum. Eklerin nasıl çalıştığını soruyorum. Örneğin, + operatörünü kullanmadan aynı davranışı nasıl simüle edersiniz? Kullanılacak bir işlev var mı? –

+0

Ah, Anladım, Güncelleme. – Prescott

+0

Bunu şöyle yapmak zorunda mıydınız: 'SomeDelegate c = (SomeDelegate) Delegate.Combine (a, b);'? + Operatörü bunu dahili olarak da yapıyor mu? –

3

Delegate.Combine statik yöntem kullanılarak yapılır.

SomeDelegate c = Delegate.Combine(a, b) as SomeDelegate; 

aslında sadece aynı += operatörü kullanılarak.

// This is the same... 
eventSource.onEvent += OnEvent; 

// ...as this. 
eventSource.onEvent = Delegate.Combine(
    eventSource.onEvent, 
    Delegate.CreateDelegate(typeof(EventSource.OnEvent), this, "OnEvent") 
    ) as EventSource.OnEvent; 

MulticastDelegate sınıf (delegate anahtar kelime arkasında sınıfı) çağrıları bir listesi var, ama bu liste sabittir. Delegeleri += işleciyle her birleştirdiğinizde, eski iki Delege nesnesinin çağırma listesini birleştirerek yeni bir MulticastDelegate örneği oluşturulur.