2012-07-07 10 views
19

Jeśli przeszukałem, na pewno otrzymam przykłady pokazania, co jest Delegatem i Działaniem. Przeczytałem podstawowe książki podające przykłady delegatów.Jaka jest różnica między Delegatem i Działaniem w C#

Ale chcę wiedzieć, jakie są ich zastosowania w prawdziwym świecie. Proszę nie podawać przykładu Hello World ani klasy Animal, ponieważ są one zbyt podstawowe:

:

  1. Jakie są różnice między nimi
  2. Kiedy używać delegata lub działania
  3. Kiedy nie używać delegata lub działania
  4. kiedy mogą być ponad zabić
+3

działanie jest delegatem którego podpis ma parametry i ma brak wartości zwrotnej. – Siege

+0

Mogę przeszukiwać i czytać MSDN na tych urządzeniach. Ale tego, czego szukam, to proste przykłady rzeczywistego świata dla delegata i działania – HatSoft

+1

Nie możesz użyć 'Akcji' bez jednoczesnego używania delegata, ponieważ' Akcja' jest specyficznym typem delegata. – CodesInChaos

Odpowiedz

22

ActionjestDelegate. Jest on zdefiniowany w następujący sposób:

public delegate void Action(); 

Można tworzyć własne typy delegatów podobnie do tworzenia metod abstrakcyjnych; piszesz podpis, ale nie ma implementacji. Następnie tworzysz wystąpienia tych delegatów, odwołując się do metody.

class Program 
{ 
    public static void FooMethod() 
    { 
     Console.WriteLine("Called foo"); 
    } 

    static void Main() 
    { 
     Action foo = FooMethod; // foo now references FooMethod() 
     foo(); // outputs "Called foo" 
    } 
} 
17

Definiując delegata, w zasadzie definiujesz podpis metody (typ zwracany i argumenty).

Akcja jest delegatem, który został już zdefiniowany (nieważny powrót i brak argumentów).

public delegate void Action() 

Możesz przejść do definicji i samemu to zobaczyć. Lub tutaj w dokumentach. http://msdn.microsoft.com/en-us/library/system.action.aspx

Prawie zawsze używam istniejących delegatów ogólnych (których akcja jest jedna), gdy podpis metody, której szukam, pasuje do obsługiwanych podpisów. Miłą rzeczą w używaniu ogólnych delegatów jest to, że są dobrze znane. Większość dev wie, że Akcja jest nieważna/nieważna. Gdybym miał zdefiniować własną wersję Akcji, wszyscy musieliby sprawdzić jej podpis, a ja po prostu powielałem coś, co już istnieje.

Na przykład ... Akcja zdarza się być nieco rzadsza, ponieważ celem metody void/void może być tylko mutacja. Funk jest bardzo powszechny (także ogólny delegat). Istnieją przykłady jego użycia w całej strukturze, szczególnie w Linq. Spójrz na. Gdzie na przykład. http://msdn.microsoft.com/en-us/library/bb534803.aspx. Jest to funkcja Func oznaczająca, że ​​bierze element typu kolekcji, nad którą pracujesz jako parametr i zwraca wartość logiczną. W kontekście zdania where, które ma Func, zwraca true oznacza włączenie go do wyników odwrotnie w przypadku false.

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, bool> predicate 
) 
+1

Jak już powiedziałem, mogę wyszukiwać i czytać MSDN, ale potrzebuję przykładu z prawdziwego świata. – HatSoft

6

Od Kenneth & Siege wskazał już kod & MSDN będę po prostu starają się wypełnić z prawdziwym przykład światowej.

Rozważ delegata, który definiuje "przenoszenie".

Delegat akcji w realnym świecie to "Biegnij" lub "Chodź". Nie obchodzi cię, z jaką szybkością się poruszasz, jaką trasę pokonasz, ani z raportem czasu, który musiałeś przenieść.

Osoba, która nie uczestniczy w działaniu, może na przykład określić, z jaką prędkością ucieka i zwróci czas potrzebny na jej ukończenie.

public delegate void MoveAction(); 
public delegate int MoveDelegate(int speed); 

Rozszerzanie przykłady oblężenie za ..

class Program 
{ 
    public static void Run() 
    { 
     Console.WriteLine("Running"); 
    } 

    public static int RunAtSpeed(int speed) 
    { 
     // logic to run @ speed and return time 
     Console.WriteLine("Running @ {0}", speed); 
     return 10; 
    } 

    public static int WalkAtSpeed(int speed) 
    { 
     // logic to walk @ speed and return time 
     Console.WriteLine("Walking @ {0}", speed); 
     return 20; 
    } 

    static void Main() 
    { 
     Action foo = Run; 
     foo(); 

     MoveDelegate run = RunAtSpeed; 
     int result1 = run(5); 

     MoveDelegate walk = WalkAtSpeed; 
     int result2 = walk(1); 
    } 
} 
3

Co to jest działanie: prostu działania, Func <>, orzecznika wszystkie są typu delegata.

Dlaczego musimy Działanie: Action obudowuje różną liczbę parametrów i innego rodzaju typ zwracany który wystarcza do tworzenia aplikacji w wielu przypadkach. Są one dostępne w przestrzeni nazw System. Możesz utworzyć własnego pełnomocnika.

Należy zauważyć, że istnieje 17 różnych typów akcji i funcji, z których każdy ma sparametryzowane od 0 do 16 argumentów ogólnych.

Działanie zawsze nie ma wartości zwracanej. Func ma pojedynczy sparametryzowany rodzajowy typ zwrotu.

IMHO, Predicate delegat nie było potrzebne, aby być zdefiniowana jako jej naprawdę równoważne Func że bierze argumentu i zwraca bool.

1

Kod przykładu z rzeczywistego świata, który był wielokrotnie wyświetlany, został już dostarczony we wcześniejszej odpowiedzi przez użytkownika "Console.WriteLine".

Jeśli chodzi o przyczynę, z tego, co zrozumiałem, Akcja jest sposobem, aby zaoszczędzić czas na definiowaniu nowych delegatów. Ponieważ jest to predefiniowany delegat poszczególnych typów sygnatur, oszczędzasz kłopotów związanych z tworzeniem różnych delegatów dla każdego zamierzonego celu. Wystarczy użyć predefiniowanego delegata akcji, aby wskazać swoje metody i je uruchomić. To samo dotyczy delegatów Func.

To raczej wygoda niż nowa funkcjonalność. Pomaga zachować krótki i zrozumiały kod przy mniejszym wysiłku.

Jeśli chodzi o pytania punktowych mądry,

  1. Co to różnica między nimi

No różnica. Akcja jest predefiniowanym delegatem, mającym na celu zaoszczędzenie ci kłopotów z wielokrotnym definiowaniem nowych delegatów.

  1. Kiedy używać delegata lub działania

Zazwyczaj delegata (i działania) jest używany w miejscach, gdzie trzeba mieć tabeli napędzane funkcjonalności. tj. być może słownik metod odpowiadających konkretnemu wymaganiu. Zauważ, że użycie tutaj Akcji ułatwia zmianę wybranej metody końcowej, wskazanie innej metody dynamicznie (może na podstawie pewnych ustawień wybranych przez użytkownika?)


class Program 
{ 
    static void Main() 
    { 
    Dictionary<string, Action> dict = new Dictionary<string, Action>(); 
    dict["loadFile"] = new Action(LoadFile); 
    dict["saveFile"] = new Action(SaveFile); 

    dict["loadFile"].Invoke(); 
    dict["saveFile"].Invoke(); 
    } 

    static void SaveFile() 
    { 
    Console.WriteLine("File saved!"); 
    } 

    static void LoadFile() 
    { 
    Console.WriteLine("Loading File..."); 
    } 
} 

Innym typowym wykorzystywany jest w sposobach zwrotne. Przykładem może być użycie klasy BubbleSort, przekazanie metody porównawczej jako delegata do klasy, która byłaby używana przez klasę BubbleSort, aby umożliwić kodowi zdefiniowanie logiki porównania, jednocześnie zajmując się wszystkim innym. Można to również wykorzystać z rozpoczętych wątków, a wątek wywołuje delegata, gdy jakieś pośrednie działania wymagają poinformowania o kodzie.

Możesz skierować ten wpis SO, aby zobaczyć świetny przykład powyższego. https://stackoverflow.com/a/3794229/1336068

  1. Kiedy nie używać delegata lub działania

Jedynym powodem mogę myśleć nie korzystania z nich, gdy sytuacja tego wymaga, to jeśli Delegata nazywać się będzie miliony razy w krótkim czasie. Występuje niewielki narzut, a jeśli powoduje to opóźnienie aplikacji, być może trzeba będzie znaleźć lepszy sposób rozwiązania tego problemu, wykorzystując bezpośrednie odniesienie do swoich funkcji zamiast przez delegata.

  1. kiedy mogą być ponad zabić

Po nich korzystać nieodpłatnie bez rzeczywistej potrzeby. W przeciwnym razie w większości sytuacji mogą być eleganckim sposobem na rozwiązanie powyższych scenariuszy.

również czytać to SO odpowiedzieć, aby zobaczyć różnice pomiędzy normalnymi metodami, delegatów, aby uzyskać lepsze zrozumienie gdzie używać delegatów/action/func https://stackoverflow.com/a/17380580/1336068

+0

. trochę długo zdyszany – Louis

Powiązane problemy