Delegaty vs Eventy

0

Witam! Mam pytanie odnośnie delegatów i eventów. Po co używać eventów, kiedy przypisujemy im tylko jedna funkcję, skoro możemy równie dobrze wywoływać delegata? Czy się mylę, bo nie wiem czy dobrze to rozumiem.

0

Podaj przykład kodu, w którym zastępujesz event przez delegata.
Delegat to wskaźnik na metodę. Jeśli chcesz np. napisać metodę, która w swoim argumencie przyjmuje inną metodę, to używasz delegata.
E event to mechanizm komunikacji między obiektami. Gdy w obiekcie X coś się stanie wywołujesz jego event E, który mogą obsłużyć obiekty A, B i C. Mechanizm ten tylko opiera się na delegatach, tzn. A, B i C muszą mieć metody zgodne z delegatem eventu E.

0

myślę o czymś takim, ostatnio jeszcze to rozumialem, ale teraz zgłupiałem bo zacząłem sobie zadawać pytania...

public delegate void SomeDelegate();
public class SomeClass{
	private SomeDelegate sd;
	
public SomeClass(SomeDelegate function)
{
	this.sd += function;
}

protected virtual DoSomething()
{
	sd();
}
}



public static void Main()
{
	SomeClass s = new SomeClass(foo);
	s.DoSomething();
}

void foo()
{
// do something
}

 
0

znalzłem w internecie, że eventy można ponadto w interfejsach podawać tak jakby były polami, mogą być tylko wywołane w klasie gdzie zostały zadeklarowane oraz eventy sa opakowana wersja delegatu, z funkcjami add i remove , ktore dodatkowo wykonywane są w sekcji krytycznej. Moze ktoś to potwierdzić i chyba tylko to są znaczące róznice...

0

Eventy korzystają z delegatów. Można używać delegatów i nie używać eventów, ale używając eventów zawsze korzysta się z delegatów. To jest ta różnica.

0

Po co używać eventów, kiedy przypisujemy im tylko jedna funkcję, skoro możemy równie dobrze wywoływać delegata?

event to takie property typu delegatowego, z akcesorami add i remove.
Teoretycznie mogłoby nie istnieć.

0

Żeby nie zaczynać nowego tematu, czy któryś z Was mógłby mi bardzo prosto wytłumaczyć czym są te delegaty i w jakich sytuacjach tego użyć? Ostatnio spędziłem trochę czasu na to i jakoś nie umiem znaleźć miejsc gdzie to mogę wykorzystać :(

1

wbrew temu co mowia niektorzy delagaty != wskazniki na funkcje.
sensem istnienia eventow jest enkapsulacja. o ile typy delegatowe zezwalaja na np. dostep do listy metod i pare innych rzadziej przydatnych opcji to event nie pozwala na wiecej niz wspomnial @Azarien

0

A czy mógłbym od Was dostać przykład sytuacji w której można tego użyć?

0

Wszędzie tam gdzie nie chcesz tworzyć obustronnych powiązań pomiędzy dwoma miejscami kodu - chcesz żeby funkcja A którą wywołujesz wywołała zwrotnie jakąś inną akcję (powiedzmy funkcję B) gdy coś się stanie - ale nie chcesz w tej funkcji A wpisać na sztywno wywołania funkcji B, bo w innym miejscu chciałbyś żeby wykonała się funkcja C
Przekazujesz w tym przypadku do funkcji A funkcję B lub C w formie delegata

Czasami jest to najprostsze wyjście żeby uniknąć cyklicznych referencji w dwóch projektach co jest niedozwolone

Odpuść sobie to zagadnienie - naucz się tylko że coś takiego jest, a jak przyjdzie potrzeba to sam odkryjesz ich przydatność

0
ne0 napisał(a):

A czy mógłbym od Was dostać przykład sytuacji w której można tego użyć?

Z tego co się orientuje to dość popularnym przykładem jest sortowanie. Spójrz, masz kolekcję obiektów typu T i chcesz je posortować, ale typ ten nie niesie żadnej informacji o tym jak sprawdzić, który z obiektów jest mniejszy, a nie masz możliwości ingerować w zdefiniowane już klasy i nie chcesz też zaprzęgać "kobyły" typu IComparer<T>. Możesz w takiej sytuacji użyć delegatu jako argumentu funkcji, która zajmie się porównaniem.

http://ideone.com/fM5OP8

using System;
using System.Collections.Generic;

public class Test
{
	public delegate int MyComparer<T>(T left, T right);
	
	public static void Sort<T>(List<T> elements, MyComparer<T> comparer)
	{
		elements.Sort((l, r) => comparer(l, r));
	}
	
	public static void Main()
	{
		var elems = new List<int> { 3, 2, 1 };
		Sort(elems, (l, r) => l.CompareTo(r));
		elems.ForEach(Console.WriteLine);
	}
}

I w dokładnie taki sam sposób (przy użyciu delegatu) jest zaimplementowana metoda List<T>#Sort w bibliotece standardowej:
https://msdn.microsoft.com/en-us/library/w56d4y5z(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/tfakywbh(v=vs.110).aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1