|
|
Opublikowano 19.01.2017 15:18:00
|
|
|
|

Od dawna zajmuję się tworzeniem .NET i niedawno recenzowałem książkę "C# Advanced Programming". Zauważyłem, że wiele problemów, które kiedyś rozumiałem, ale nie rozumiałem, można powoli badać i rozumieć.
Dlatego planuję zacząć pisać wpis na blogu o "Serii Zaawansowanego Programowania w C#". Będzie czerpać z koncepcji książki "C# Advanced Programming" i odnieść się do wpisów na blogach innych ekspertów, mam nadzieję, że rozumiesz. Jeśli coś jest nie tak, proszę to poprawić.
(Ponadto: Ten wpis na blogu nie wyjaśni podstaw definicji i gramatyki.) )
Porozmawiajmy o mianowaniu do służby.
Delegate jest szeroko używany w .NET. Zaangażowane będą wyrażenia lambda, wydarzenia, metody anonimowości itp. (śledźcie kolejne wpisy na blogu).
Czym więc jest powierzenie?
W prostych terminach delegati nie różnią się od metod określających tylko to, że muszą podać słowo kluczowe delegata i nie posiadają jednostki metody. Możesz myśleć o tym jak o tymczasowym zastępstwie, na przykład, gdy piszesz kod nie wiedząc, z czym będziesz się mierzyć. Musisz tylko znać typ parametrów i typ wyjścia, które zamierzasz wprowadzić, i je zdefiniować. To metoda przedstawiona w książce, że podpis musi oznaczać to samo.
Zdefiniujmy podstawową delegację:
Wyniki realizacji:
Czy widzisz powyższe praktyczne miejsce do zaufania? MianowicieDelegat może wykonać dowolną metodę z tym samym typem parametrów pobierania i typem return, a nawet kolejkę metod o tym samym podpisie.
Czy więc nasze sygnatury metod (czyli parametry importu i wyjścia) naprawdę muszą być dokładnie takie same jak w przypadku delegata? Odpowiedź: Nie, nie możemy ignorować kowariancji i wariancji odwrotnej. Krótko przedstawmy wiedzę o kowariantach i inwerterach.
"Kowariancja" oznacza możliwość użycia typu, który jest bardziej wyprowadzony niż pierwotnie określony typ pochodny. "Inwerter" odnosi się do możliwości użycia typu o mniejszym stopniu pochodzenia. Wtedy nasza komisja również podlega kowariancji i odwrotności.
Oznacza to, że jeśli delegat zostanie zdefiniowany, nie tylko ta sama metoda podpisu może przypisać wartość zmiennej delegata.
Jeśli tabela parametrów metody odpowiada deklaracji delegata, ale zwraca wyprowadzoną klasę (deklaracja delegata zwraca typ), to metoda może być również przypisana do tej zmiennej delegata.
Jeśli typ return metody odpowiada deklaracji delegata, ale argument jest klasą przodka typu parametru deklaracji delegata, to metoda może być również przypisana do zmiennej delegata.
Jeśli parametry i typ zwrotu metody odpowiadają założeniom z powyższych dwóch linii, to metoda może być również przypisana do zmiennej delegata.
Poniżej znajduje się prosty przykład różnicy kowariantnej kontra inwerter:
Kowariancja:
Inwerter:
|
Poprzedni:Konstrukcja MFCNastępny:Jak ustalić, który PID procesu jest zajęty przez plik
|