2013-12-09 11 views
6

Jestem nowy w koncepcji delegatów. Nauczyłem się, że jest podobny do wskaźników w C++. W jego zaletach wspomniano, że efektywne wykorzystanie delegatów poprawia wydajność.W jaki sposób delegaci poprawiają wydajność aplikacji?

Biorąc pod uwagę, że jest wskaźnikiem. W jaki sposób poprawia wydajność aplikacji?

Jeśli ktoś mógłby to wyjaśnić na prostym przykładzie, byłoby to pomocne.

+4

Gdzie przeczytałeś, że "poprawia to wydajność aplikacji?" – dbw

+1

http://www.codeproject.com/Articles/11657/Understanding-Delegates-in-C – thevan

+4

Nie wierz we wszystko, co czytasz. Delegaci nie mają na celu poprawy wydajności. Mają one zapewnić naprawdę czysty, piękny wzór wywołania zwrotnego. –

Odpowiedz

4

Delegaci nie są bezpośrednio o poprawianiu wydajności - dotyczą one wywoływania abstrakcyjnego. W terminologii C++ jest to w istocie jak wskaźnik metody.

Większość zastosowań delegatów to: niezwiązana z wydajnością. Wyjaśnijmy to od samego początku.

Jednak jednym z głównych momentów, w których można to wykorzystać, jest to, że pozwala to na takie scenariusze jak metaprogramowanie. Kod (zwykle kod biblioteki) może konstruować złożone łańcuchy zachowań na podstawie informacji o konfiguracji w czasie wykonywania, a następnie skompilować tę informację do metody za pomocą dowolnego z Expression, TypeBuilder lub DynamicMethod (lub w zasadzie dowolnego API, które pozwala konstruować IL). Ale aby wywołać takiej dynamicznie generowanej metody, potrzebujesz delegata - ponieważ twój statyczny IL, który został skompilowany z C# nie może odnosić się do metody, która nie istnieje w tym czasie.

Należy zauważyć, że alternatywnym sposobem wykonania tego byłoby użycie TypeBuilder do utworzenia (w czasie wykonywania) nowego typu, który dziedziczy z podklasy lub implementuje znany interfejs, a następnie utworzenia wystąpienia dynamicznie generowanego typu, który może być rzutować na oczekiwane API w zwykły sposób i wywoływać normalnie.

2

Delegaci nie mają znaczący pozytywny lub negatywny wpływ na wydajność aplikacji. To, co zapewniają, to sposób oddzielenia od siebie aspektów aplikacji.

Powiedzmy, że masz sytuację, w której klasa A dzwoni pod numer B.foo(). A jest teraz częściowo sprzężony z B. Możesz wtedy mieć sytuację, w której B musi zadzwonić pod numer A.bar(). Teraz ryzykujesz mocne połączenie obu. Jeśli zamiast wystawiać A na B, zamiast tego przekazać bar jako delegata, to usunięto to połączenie.

Powiązane problemy