Tytuł wprowadza w błąd, więc proszę przeczytać całe pytanie :-) .
Przez „operator przypisania złożonego” mam na myśli taką konstrukcję op=
, na przykład +=
. Czysty operator przypisania ( =
) nie należy do mojego pytania.
Przez „dlaczego” nie mam na myśli opinii, ale zasób (książkę, artykuł itp.), Gdy niektórzy projektanci lub ich współpracownicy itp. Wyrażają swoje rozumowanie (tj. Źródło wyboru projektu).
Zastanawia mnie asymetria występująca w C ++ i C # ( tak, wiem, że C # to nie C ++ 2.0 ) - w C ++ przeciążymy operatora, +=
a następnie prawie automatycznie napiszemy odpowiedni +
operator w oparciu o wcześniej zdefiniowany operator. W języku C # jest odwrotnie - przeciążasz się +
i +=
jest dla Ciebie syntetyzowany.
Jeśli się nie mylę, późniejsze podejście zabija szansę na optymalizację w przypadku faktycznej +=
, ponieważ trzeba stworzyć nowy obiekt. Tak więc musi być duża zaleta takiego podejścia, ale MSDN jest zbyt nieśmiały, aby o tym powiedzieć.
I zastanawiam się, co to za korzyść - więc jeśli zauważyłeś wyjaśnienie w jakiejś książce C #, wideo na temat technologii, wpisie na blogu, będę wdzięczny za odniesienie.
Najbliższą rzeczą, jaką znalazłem, jest komentarz na blogu Erica Lipperta. Dlaczego przeciążeni operatorzy są zawsze statyczni w C #? autor: Tom Brown. Jeśli najpierw zdecydowano o przeciążeniu statycznym, po prostu określa, którzy operatorzy mogą być przeciążeni dla struktur. To dodatkowo decyduje o tym, co może być przeciążone dla klas.
źródło
+=
wydaje się absurdalne; dlaczego miałbyś przeciążać operację złożoną zamiast jej części?*=
mutacja typu odniesienia jest semantycznie niepoprawna.Odpowiedzi:
Nie mogę znaleźć odniesienia do tego, ale zrozumiałem, że zespół C # chciał zapewnić rozsądny podzbiór przeciążania operatora. W tym czasie przeciążenie operatora miało zły rap. Ludzie twierdzili, że zaciemnia kod i można go używać tylko do zła. Zanim projektowano C #, Java pokazała nam, że żadne przeciążenie operatora nie jest denerwujące.
Więc C # chciał zrównoważyć przeciążenie operatora, aby trudniej było robić zło, ale można było też robić fajne rzeczy. Zmiana semantyki przydziału była jedną z rzeczy, które zawsze uważano za złe. Pozwalając
+=
i jego krewni być przeciążona, pozwoliłoby to tego rodzaju rzeczy. Na przykład, jeśli+=
zmutowane odniesienie zamiast nowego, nie będzie zgodne z oczekiwaną semantyką, co prowadzi do błędów.źródło