Jedną z największych zalet odniesień w stosunku do wskaźników jest większa prostota i czytelność. Jak zawsze, gdy upraszczasz coś, ułatwiasz korzystanie, ale kosztem elastyczności i kontroli, którą uzyskujesz dzięki rzeczom niskiego poziomu (jak wspominali inni).
Wskaźniki są często krytykowane za to, że są „brzydkie”.
class* myClass = new class();
Teraz za każdym razem, gdy go używasz, musisz najpierw go usunąć
myClass->Method() or (*myClass).Method()
Pomimo utraty czytelności i dodania złożoności, ludzie nadal musieli często używać wskaźników jako parametrów, aby można było modyfikować rzeczywisty obiekt (zamiast przekazywać wartość) i aby zwiększyć wydajność bez konieczności kopiowania dużych obiektów.
Dla mnie właśnie dlatego „narodziły się” odniesienia, aby zapewnić te same korzyści co wskaźniki, ale bez całej tej składni wskaźników. Teraz możesz przekazać rzeczywisty obiekt (nie tylko jego wartość) ORAZ masz bardziej czytelny, normalny sposób interakcji z obiektem.
MyMethod(&type parameter)
{
parameter.DoThis()
parameter.DoThat()
}
Referencje C ++ różniły się od odwołań C # / Java tym, że po przypisaniu do nich wartości to było to, nie można było jej ponownie przypisać (i musi zostać przypisane, gdy zostało zadeklarowane). To było to samo, co użycie wskaźnika do stałej (wskaźnika, którego nie można było ponownie wskazać na inny obiekt).
Java i C # to bardzo zaawansowane, nowoczesne języki, które usuwały wiele bałaganu, który nagromadził się w C / C ++ przez lata, a wskaźniki były zdecydowanie jedną z tych rzeczy, które należało „wyczyścić”.
Jeśli twój komentarz na temat znajomości wskaźników czyni cię silniejszym programistą, jest to prawdą w większości przypadków. Jeśli wiesz, „jak” coś działa, w przeciwieństwie do zwykłego używania tego bez wiedzy, powiedziałbym, że często może to dać ci przewagę. Jak duża przewaga zawsze będzie się zmieniać. W końcu używanie czegoś bez wiedzy, jak jest zaimplementowane, jest jednym z wielu uroków OOP i interfejsów.
W tym konkretnym przykładzie, co wiedza o wskaźnikach pomogłaby w znalezieniu odniesień? Zrozumienie, że odwołanie w C # NIE jest samym obiektem, ale wskazuje na obiekt, jest bardzo ważną koncepcją.
# 1: NIE przekazujesz wartości
Cóż, na początek, kiedy używasz wskaźnika, wiesz, że wskaźnik zawiera tylko adres, to wszystko. Sama zmienna jest prawie pusta i dlatego tak miło jest przekazywać jako argumenty. Oprócz zwiększenia wydajności pracujesz z rzeczywistym obiektem, więc wszelkie wprowadzone zmiany nie są tymczasowe
# 2: Polimorfizm / interfejsy
Kiedy masz odniesienie, które jest typem interfejsu i wskazuje na obiekt, możesz wywoływać tylko metody tego interfejsu, nawet jeśli obiekt może mieć znacznie więcej możliwości. Obiekty mogą też inaczej implementować te same metody.
Jeśli dobrze rozumiesz te koncepcje, to nie sądzę, że tracisz zbyt wiele z powodu nieużywania wskaźników. C ++ jest często używany jako język do nauki programowania, ponieważ czasami dobrze jest ubrudzić sobie ręce. Ponadto praca z aspektami niższego poziomu sprawia, że doceniasz wygodę nowoczesnego języka. Zacząłem od C ++, a teraz jestem programistą C # i czuję, że praca z surowymi wskaźnikami pomogła mi lepiej zrozumieć, co się dzieje pod maską.
Nie sądzę, aby każdy musiał zaczynać od wskaźników, ale ważne jest, aby rozumieli, dlaczego zamiast typów wartości używa się odwołań, a najlepszym sposobem na zrozumienie tego jest przyjrzenie się jego przodkowi, wskaźnikowi.