2016-03-13 46 views
5

Czytałem książkę ilustrowaną C# 2012 w sekcji Łączenie Punktów Delegatów nie zauważam? Cel delegatów jest niezmienny.Jaki jest cel delegatów są niezmienne w języku C#?

Łącząc Delegaci Wszyscy delegaci widzieliście do tej pory miał tylko jedną metodę w swoich listach wywołania. Delegatów można łączyć " za pomocą operatora dodawania. Rezultatem operacji jest utworzenie nowego delegata, z listą wywołań, która jest konkatenacją kopii list wywołań dwóch argumentów operandowych . Na przykład poniższy kod tworzy trzech delegatów. Trzeci uczestnik jest tworzony z połączenia dwóch pierwszych.

MyDel delA = myInstObj.MyM1; 
MyDel delB = SClass.OtherM2; 
MyDel delC = delA + delB; // Has combined invocation list 

Chociaż termin łącząc delegatów może sprawiać wrażenie, że delegaci operand są zmodyfikowane, są one w ogóle nie zmieniło. W przypadku fakt, że delegaci są niezmienni. Po utworzeniu obiektu uczestnika nie można go zmienić. Rysunek 15-6 ilustruje wyniki poprzedniego kodu. Zauważ, że delegaci operandów pozostają niezmienione.

enter image description here

+0

Delegaci są w rzeczywistości wskaźnikami metod. Co byś zrobił, aby zmutować takiego delegata? Zmodyfikuj podstawową metodę? –

+1

@YuvalItzchakov Cóż, prawdopodobnie OP może pomyśleć, że mogą być zmienne, więc dodanie dwóch delegatów ponownie wykorzystuje jedną z instancji delegatów i dodaje delegata do listy inwokacji ... kto wie –

Odpowiedz

7

Bezpieczeństwo gwintów i prędkość są tutaj najważniejsze. Aktualizacja delegata nie jest atomowa, wymaga aktualizacji 6 pól i listy. Sprawienie, by był atomowy, więc nie może ulec uszkodzeniu, wymaga blokady, o wiele za drogie dla takiej podstawowej operacji, która rzadko musi być zabezpieczona przez wątkiem.

Uczyniając go niezmiennym, obiekt uczestnika nie może zostać uszkodzony, ponieważ zawsze ustawia pola na obiekcie, do którego nikt jeszcze nie ma odniesienia. Ponowne przypisanie odwołania do obiektu delegowanego jest atomowe, co jest podstawową gwarancją modelu pamięci .NET. Nie ma już potrzeby blokowania. Kompromis jest mniej efektywnym wykorzystaniem pamięci, jest to niewielka kara.

Należy pamiętać, że aktualizacja delegowanych wątków nie powoduje automatycznego wątku kodu. Kod testu i pożaru musi skopiować referencję, aby uniknąć NRE, i możesz wykonać wywołanie zwrotne metody, która już została anulowana.

2

Delegaci są wskaźniki do metody, betonu lub anonimowy (dobrze, nawet anonimowe metody są kompilowane z pewnym kompilator wygenerowany identyfikator).

Byłoby uzasadnione, że coś, co wskazuje na konkretną rzecz, jest zmienne? Nie sądzę. Każda instancja reprezentuje wskaźnik do jakiejś metody. Czy chcesz wskazać inną metodę? Utwórz nowy wskaźnik. Oznacza to, że utworzysz nowego delegata.

Z drugiej strony dodanie dwóch lub więcej uczestników ma ten wynik, ponieważ + operator can be overloaded. Oznacza to, że delegaci mogą być częścią dodania, ale wewnętrznie przeciążenie + tworzy nowego delegata z listą wywołań.