Cel delegatów [duplikat]

To pytanie ma już odpowiedź tutaj:

Duplikat:

Różnica między wydarzeniami a delegatami i ich odpowiednimi aplikacjami

Jakie są zalety delegatów?

Gdzie używam delegaci?

Ciekawe jaki jest cel delegatów. Nie używałem ich zbyt wiele i nie mogę naprawdę coś wymyślić.

W moich kursach napisano, że delegat jest niebieskim drukiem dla wszystkich metod zgodnych z jego podpisem.

Możesz również dodać wiele metod do jednego delegata, a następnie będą one wykonywane po sobie w kolejności, w jakiej zostały dodane. Co jest prawdopodobnie przydatne tylko dla metod wpływających na zmienne lokalne lub metod, które nie zwraca dowolne wartości.

Czytałem, że C# implementuje zdarzenia jako delegatów, co jest udokumentowane jako:

//Summary: Represents the method that
will handle an event that has no event
data.

//Parameters:

//sender: The source of the event.

//e: An System.EventArgs that contains no event data.

[Serializable]

[ComVisible(true)] 

public delegate void EventHandler(object sender, EventArgs e);
/ Align = "left" / Czy ktoś może podać dobry, użyteczny przykład tego pojęcia?
Author: Community, 2009-03-27

7 answers

Tak,

Już prawie jesteś. Delegat odnosi się do metody lub funkcji, które mają być wywołane. . NET używa zdarzeń, aby powiedzieć.. kiedy ktoś naciśnie ten przycisk, Chcę, żebyś wykonał ten fragment kodu.

Na przykład w użyciu aplikacji GPS:

public delegate void PositionReceivedEventHandler(double latitude, double longitude);

To mówi, że metoda musi przyjmować dwa podwajania jako wejścia i zwracać void. Kiedy dochodzimy do zdefiniowania zdarzenia:

public event PositionReceivedEventHandler PositionReceived;  

Oznacza to, że zdarzenie Positionreceved, wywołuje metodę o tym samym definicja jako Delegat PositionReceivedEventHandler zdefiniowaliśmy. So when you do

PositionRecieved += new PositionReceivedEventHandler(method_Name);

Method_Name musi pasować do delegata, abyśmy wiedzieli, jak wykonać metodę, jakich parametrów oczekuje. Jeśli używasz projektanta Visual Studio, aby dodać niektóre zdarzenia do przycisku, na przykład, to wszystko będzie działać na delegata oczekującego obiektu i parametru EventArgs.

Mam nadzieję, że to pomoże...
 26
Author: Ian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-26 21:38:24

Jak zauważyłeś delegat jest sposobem na utworzenie podpisu dla wywołania metody. Jest wiele wspaniałych przykładów wykorzystania delegatów, ale ten przykład naprawdę otworzył mój umysł.

public delegate Duck GetDuckDelegate();

public GetDuckDelegate GiveMeTheDuckFactoryMethod(string type)
{
  switch(type)
  {
    case "Rubber":
      return new GetDuckDelegate(CreateRubberDuck);
    case "Mallard":
      return new GetDuckDelegate(CreateMallardDuck);
    default:
      return new GetDuckDelegate(CreateDefaultDuck);
  }
}

public Duck CreateRubberDuck()
{
  return new RubberDuck();
}

public Duck CreateMallardDuck()
{
  return new MallardDuck();
}

public Duck CreateDefaultDuck()
{
  return new Duck();
}

Następnie użyć go

public static void Main() {
  var getDuck = GiveMeTheDuckFactoryMethod("Rubber");
  var duck = getDuck();
}

Prawdopodobnie, wzorzec fabryczny byłby lepszą metodą na to, ale wymyśliłem ten przykład w locie i pomyślałem, że udowodni to, jak delegaci mogą być traktowani jako obiekty

 14
Author: bendewey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-26 21:42:34

Delegaty pozwalają przekazywać metody podobne do wartości.

Na przykład. Net ma metodę o nazwie Array.ForEach, która pobiera delegata i tablicę i wywołuje delegata na każdym elemencie tablicy.

Dlatego możesz napisać,

int[] arr = new int[] { 1, 2, 4, 8, 16, 32, 64 };
Array.ForEach(arr, new Action<int>(Console.WriteLine));

Ten kod wywoła Console.WriteLine dla każdej liczby w tablicy.

Jest wiele rzeczy, które możesz zrobić, tworząc funkcje, które przyjmują delegatów, zwłaszcza w połączeniu z metodami anonimowymi. Na przykład, spójrz na LINQ .

 3
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-27 00:37:55

Mogę podać przykład użycia architektury aplikacji webowej:

Ogólnie rzecz biorąc, dzięki aplikacji internetowej można zapewnić frontowy kontroler, który odbiera żądania od wielu klientów. Możemy umieścić wszystkie nasze metody w kontrolerze frontowym do radzenia sobie z wieloma różnymi rodzajami żądań od klientów. Jednak staje się to trochę uciążliwe. Zamiast tego możemy użyć delegatów do hermetyzacji funkcjonalności dla różnych żądań. Moglibyśmy mieć:

  • Authentication Delegate
  • Delegat Zarządzania Użytkownikami

I tak dalej. Jest to więc zgrabny sposób na podzielenie funkcjonalności na logiczne części-delegatów. Struktura Struts opiera się na tym sposobie działania (klasy ActionServlet i Action).

 2
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-26 21:38:20

Istnieje wiele doskonałych artykułów wyjaśniających delegatów - oto kilka dobrych:

Delegaci i Wydarzenia
C# delegaci wyjaśnione
delegaci w C #

 2
Author: Andrew Hare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-26 21:39:16

Wiele osób początkowo myli się z rzeczywistą potrzebą delegatów i wydarzeń. Byłem jednym z nich i zajęło mi trochę czasu, aby to rozgryźć: -). Ostatnio odpowiedział na podobne zapytanie w ASP.NET Forum i pomyślałem, że byłoby dobrze, gdybym stworzył post na blogu na ten temat! Oto ZAPYTANIE:

" czytałem gdzieś przykład klasy Banku, że jeśli minimalne saldo zostanie osiągnięte, musisz poinformować resztę aplikacji, że min osiągnął, ale nie możemy tego zrobić, po prostu wywołując normalna metoda. na przykład: powiedzmy, że kiedy odliczymy pewną kwotę od salda i jeśli osiągniemy minimum, to wywołamy jakąś metodę, aby podjąć jakieś działanie, całkowicie mi brakuje, dlaczego potrzebujemy delegatów i niestandardowych wydarzeń tutaj?"

Rzecz jest w Przypadku Banku, zdecydowanie można wywołać metodę, ale wtedy byłoby to proste programowanie proceduralne, potrzebujemy programowania opartego na zdarzeniach, gdy chcemy, aby nasz kod odpowiadał na niektóre zdarzenia generowane przez system.

Dla np.: myślę, że system operacyjny windows jest system, a my piszemy kod (w dowolnym języku), w którym chcemy uchwycić zdarzenie takie jak mouse_click (). Skąd nasz program wiedziałby, że nastąpiło kliknięcie myszką? Możemy użyć do tego kodu niskiego poziomu, ale ponieważ system operacyjny już obsługuje kod niskiego poziomu, najlepiej jest uchwycić zdarzenie wywołane przez system operacyjny.

Innymi słowy, w momencie wystąpienia mouse_click() system operacyjny uruchamia Zdarzenie. System operacyjny nie obchodzi, kto przechwytuje to wydarzenie i używa go, po prostu wysyła powiadomienie. Wtedy dowolny kod (jak nasz) może uchwycić to wydarzenie i odpowiednio z niego korzystać. To oszczędza nam dużo czasu, aby napisać kod dla tego samego siebie. Inne programy również mogą używać tego samego zdarzenia i odpowiednio je obsługiwać.

Podobnie system bankowy może być ogromny, a dostęp do niego może mieć wiele innych zewnętrznych aplikacji. System bankowy nie wie, ile jest takich aplikacji, które go potrzebują, lub są od niego zależne, i jak poradziłyby sobie w pewnych sytuacjach, takich jak gdy równowaga jest niska, więc po prostu wywołuje zdarzenie za każdym razem, gdy wystąpi niski stan konta i zdarzenie to może być użyte przez dowolny inny kod, poza samym kodem bankowym.

Zauważ, że każdy susbcriber tego zdarzenia może obsłużyć to zdarzenie niezależnie, np. kod bankowy może uniemożliwić wykonanie czegoś, jeśli saldo jest niskie, inna aplikacja do raportowania może w takim przypadku wysłać wiadomość e-mail lub kod bankomatu może zatrzymać konkretną transakcję i powiadomić użytkownika, że saldo jest niskie.

Mam nadzieję, że to trochę wyjaśni!

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-20 07:54:53

Delegaci, według mojego zrozumienia, zapewniają sposób specjalizowania się w zachowaniu klasy bez jej podklasowania.

Niektóre klasy mają złożone zachowania ogólne, ale nadal mają być wyspecjalizowane. Pomyśl o klasie okna w frameworku GUI: okno może prawdopodobnie zrobić wiele samodzielnie, ale najprawdopodobniej nadal chcesz go specjalizować w jakiś sposób. W niektórych frameworkach odbywa się to poprzez dziedziczenie. Inaczej jest z delegatami. Say you want something to happen gdy okno zmienia rozmiar: twoja klasa delegata może zaimplementować metodę o nazwie onWindowResize (oczywiście pod warunkiem, że Klasa Window obsługuje to), która jest wywoływana za każdym razem, gdy okno zmienia rozmiar i jest odpowiedzialna za wszelkie specjalistyczne zachowanie, gdy okno zmienia rozmiar.

Nie będę dyskutować o zaletach delegacji nad dziedziczeniem, ale wystarczy powiedzieć, że jest wielu, którzy uważają, że delegacja jest "czystsza" niż dziedziczenie.

 1
Author: KaptajnKold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-26 21:53:24