2009-04-08 12 views
37

Istnieją pewne Delegaci predefiniowane w języku C#Standardowe delegatów w C#

Znam te:

EventHandler // Default event callbacks 
EventHandler<T> // Default event callbacks with custom parameter (inheriting from EventArgs) 
Action // Function without return value and without parameter 
Action<T1, T2, T3, T4> // Function without return value and 1-4 parameters 
Func<T1, T2, T3, T4, TResult> // Methos with 0-4 parameters and one result type 
Predicate<T> // equivalent to Func<T, bool> 

Istnieje wiele więcej w szczególnych przypadkach i wygenerowanych częściach postaci ram, ale są to często dobry używać w samouczącym się kodzie.

Jeśli znasz bardziej przydatne, dodaj je. W przeciwnym razie odpowiedź zostanie udzielona.

+3

Chciałbym ponownie otworzyć i przekonwertować go na stronę wiki społeczności. – Tarion

Odpowiedz

23

Nie są one predefiniowane w języku C#. Są one zdefiniowane przez architekturę z zakresu.

W Action i Func rodziny delegat są szersze niż masz pokazane - idą do

Action<T1, T2, T3, T4> 

i

Func<T1, T2, T3, T4, TResult> 

Innym częstym-owski jednym w .NET 2.0 na liście manipulacji (przed LINQ) to Predicate<T>.

Do pracy z wątków:

ThreadStart 
ParameterizedThreadStart 
WaitCallback 
TimerCallback 
AsyncCallback 
+0

To jednak sprawia, że ​​się zastanawiasz. Jeśli generics i Func/Action były dostępne w wersji 1.0, czy mielibyśmy jakieś inne typy delegatów? – JaredPar

+0

To interesujące pytanie. Ja raczej lubię Predicate jako bardziej wymowną nazwę niż na przykład Func - gdyby nie przeciążenia Where itp., Aby wziąć Func byłoby lepiej pasować do LINQ. Określenie wszędzie argumentów typu może zaszkodzić czytelności. –

2

Przejdź do: Reflector Wyszukaj System.MulticastDelegate i sprawdź typy pochodne. Otrzymasz listę wszystkich Delegatów, których szukasz.

+0

Cóż, daje to pełną listę delegatów. Nie daje to najbardziej użytecznych ani ważnych, a taki jest PO po moim pomyśle. –

3

Lubię używać Predicate<T> co odpowiada Func<T, bool>

0

używam WaitCallback i ThreadStart dość często im się dostać wzmiankę.

Jeśli znasz podpis delegata jesteś po, ale nie wiem, czy istnieje istniejący delegat z tym podpisem, które można wykorzystać, można śledzić these instructions na moim blogu, aby znaleźć jeden .

+0

Link wydaje się być nieaktualny. –

1

Ja również natknąć

Comparison<T> 

w sposób rodzajowy

List.Sort(Comparison<T>) 

. Przypuszczam, że jest to teraz odpowiednik:

Func<T1, T2, int> 
Powiązane problemy