2013-07-09 29 views
6

Delegeler üzerinde MSDN page okuyordum ve açıkça görünüyorlar. Sonra onları kullanan bir kod bakıyordu ve ben bunu gördüm:Bu temsilci yöntemi ne yapıyor?

public delegate void NoArguments(); 
public NoArguments Refresh = null; 
Refresh = new NoArguments(Reset); 

Bu beni rahatsız eden üçüncü satır. Bir delegeyi nasıl new yapabilirsin? Bu bir nesne değil, bir yöntem veya bir yönteme delege. MSDN sayfasındaki örneğe göre, temsilci örneğini oluşturmak, atamadan değil, basit atamadan geçer. Ayrıca, temsilci bildirimi hiçbir parametre almazken, Reset parametresini alan temsilci için new neden kullanılır?

cevap

1

Temsilci "bir yönteme delege", aynı zamanda bir nesne. Herhangi bir decompiler içinde NoArguments bakarsanız, aslında MulticastDelegate, çeşitli yöntemlerle (Invoke, BeginInvoke, EndInvoke) devralan bir sınıf olduğunu göreceksiniz.

C#, tarihi nedenlerle, new NoArguments(method) kullanarak bu sınıfın örneklerini oluşturmanıza olanak sağlar. Ancak modern versiyonlarda aynı şeyi yapan bir method kısayol notasyonunu da destekliyor. Her iki durumda da, Refresh'da NoArguments türünde bir nesneye sahipsiniz.

+0

Sadece bir işlev işaretçisi değil, bir nesne olduğuna dikkat ettiğiniz için teşekkür ederiz. – johnbakers

4

delegate anahtar sözcüğü, temel olarak bir işlev imzası olduğunu gösterir; bu nedenle, Refresh, hiçbir argüman almayan bir işlevin işaretçisine dönüşür. Ancak, Refresh işaretçisine bir şey atamak için, işaret etmek için bir işlev vermeniz gerekir. Bu durumda, Reset işlevidir. Ve ayrıca, Reset işlevinin hiçbir argüman almaması gerekir. Ayrıca

, sözdizimi:

Refresh = Reset; 

da geçerlidir ve daha resmi sözdizimi için sadece sözdizimsel şeker: her iki durumda da

Refresh = new NoArguments(Reset); 

, daha sonra Sıfırlama işlevi yürütebilir Yenile çağırarak: Ancak

Refresh(); 

Notyürütmek eğer 10 atanmadan, bir istisna oluşturabilirdiniz.

if (Refresh != null) Refresh(); 
else { 
    // Refresh was never assigned 
} 
2

Sen temsilci bir işlev türü gibi olduğunu düşünebilirsiniz: Bunu önlemek için bir yol boş karşılaştırılmak üzere olurdu

  • Declare tipi, fonksiyon void verir ve hiç bir delilleri yok:

    verilen bir tür
    public delegate void NoArguments(); 
    
  • Declare değişken ve başlatmak:

    public NoArguments Refresh = null; 
    
  • Değişkeninize yeni bir nesne atayın. Nesne aslında temsilcisi ile aynı imzaya sahip olmalıdır bir işlev Reset şöyledir:

    Refresh = new NoArguments(Reset); 
    

GÜNCELLEME:

daha fazla detay için aşağıdaki linki inceleyebilirsiniz: C# Delegates