2009-03-09 13 views
3

Bu, hızlı bir şekilde olmalıdır. Böyle bir şey yapmak mümkün mü:Arama fonksiyonu üzerine # 2 numaralı işlevi otomatik olarak çağırır # 1

[Callback(funtionY)] 
void functionX() 
{ 
} 

void functionY() 
{ 
} 

Böylece, işlevX çağrıldığında, functionY otomatik olarak da adlandırılır? Sorduğumun nedeni, küçük bir XNA tabanlı oyun motoruna ağ işlevselliğini uygulayacağım ve bir işlev çağrıldığında tüm istemciler arasında çağrılması gerektiğini işaretlemek için işlevleri Senkronize olarak işaretlemek istiyorum.

Teşekkürler.

cevap

5

Muhtemelen PostSharp ile bunu kolayca yapabilirsiniz, ancak genel olarak: hayır; açıkça söylemek zorundasın. Söz konusu açıklamasına dayanarak

void functionX() 
{ 
    functionY(); 
    // ... etc 
} 

bu geçerli bir cevap var:

2

Eğer bunu yapamaz bir sebep mi var. Yine de bunu düşündüğünüzü farz ediyorum.

başka olasılık, bir şey (derlenmemiş) gibi sizin yararınıza eventing sistemini kullanmak olacaktır:

event Action FunctionXCalled; 

// somewhere in initialization... 
MyCtor() 
{ 
    FunctionXCalled += functionY; 
} 

void functionY() { } 

void functionX() 
{ 
    if(FunctionXCalled != null) FunctionXCalled(); 
    // ... etc 
} 
+0

+1, belirtilen gereksinimleri karşıladığından beri :) –

+0

Geçerli yanıt, ancak çok sayıda olması gerektiği için senkronize edilmesi gereken her yöntemde el ile işlevini çağırmak istemiyorum. – Aistina

+0

Ummm, tek bir işlev çağrısı eklemenin bir özellik eklemekten daha pahalı olduğunu bilmiyorum. İşlev çağrısı, özniteliğin eklediği sonraki bakım için bağımlılık veya bilişsel uyumsuzluk eklemez. –

0

nasıl:

void functionX() { 
    functionY(); 
    // Other implementation stuff 
} 

void functionY() { 

} 
4

Evet, sadece onları oluşturabilir temsilci.

Action foo = functionX; 
foo += functionY; 

foo(); // both called 

GÜNCELLEŞTIRME: Jon (teşekkürler), çağrı siparişinin gerçekte belirlendiğine dikkat çekti. Ancak buna asla güvenmeyeceğim. Yorumlara bakınız.

+0

Sipariş *, * belirtilmiştir. FunctionX ve ardından functionY olduğu garanti edilir. Delegate.Combine için dokümanlar bakın. –

+0

Onları sırayla ekler, ancak aynı sırada yürütülecek olup olmadığı belirtilmez. Dokümanlar, sipariş verme emrinden hiç bahsetmez ve önemli olmamalıdır, aksi takdirde MulticastDelegate değil, SıralıDelegate olarak adlandırdıklarından şüpheleniyorum. – leppie

+1

Düzeltilmeye devam ediyorum. Delegate sınıf sayfasından follwoing'i buldum: 'Çağırma sırasında yöntemler, çağrılanlar listesinde göründükleri sıraya göre çağrılır.' IMO bu çok akıllı bir tasarım kararı değil. Şimdi kullanıcılara çağrı siparişine güveneceğiz. – leppie

İlgili konular