Einer der größten Vorteile von Referenzen gegenüber Zeigern ist die größere Einfachheit und Lesbarkeit. Wie immer, wenn Sie etwas vereinfachen, vereinfachen Sie die Verwendung, aber auf Kosten der Flexibilität und Kontrolle erhalten Sie die Low-Level-Inhalte (wie andere bereits erwähnt haben).
Zeiger werden oft als "hässlich" kritisiert.
class* myClass = new class();
Jedes Mal, wenn Sie es verwenden, müssen Sie es zuerst zuerst dereferenzieren
myClass->Method() or (*myClass).Method()
Trotz des Verlusts der Lesbarkeit und der Erhöhung der Komplexität mussten die Benutzer häufig Zeiger als Parameter verwenden, damit Sie das tatsächliche Objekt ändern konnten (anstatt den Wert zu übergeben) und um den Leistungsgewinn zu erzielen, dass keine großen Objekte kopiert werden mussten.
Für mich ist dies der Grund, warum Referenzen in erster Linie "geboren" wurden, um den gleichen Vorteil wie Zeiger zu bieten, jedoch ohne all diese Zeigersyntax. Jetzt können Sie das eigentliche Objekt übergeben (nicht nur seinen Wert) UND Sie haben eine besser lesbare, normale Art der Interaktion mit dem Objekt.
MyMethod(&type parameter)
{
parameter.DoThis()
parameter.DoThat()
}
C ++ - Referenzen unterschieden sich von C # / Java-Referenzen darin, dass Sie einen Wert, der es war, nicht erneut zuweisen konnten (und er muss zugewiesen werden, als er deklariert wurde). Dies war dasselbe wie die Verwendung eines const-Zeigers (ein Zeiger, der nicht erneut auf ein anderes Objekt gerichtet werden konnte).
Java und C # sind moderne Sprachen auf sehr hohem Niveau, die viele der in C / C ++ im Laufe der Jahre angesammelten Probleme beseitigt haben, und Zeiger waren definitiv eines der Dinge, die "bereinigt" werden mussten.
Soweit Ihr Kommentar zum Erkennen von Zeigern Sie zu einem stärkeren Programmierer macht, trifft dies in den meisten Fällen zu. Wenn Sie wissen, wie etwas funktioniert, anstatt es nur zu verwenden, ohne es zu wissen, würde ich sagen, dass dies Ihnen oft einen Vorteil verschaffen kann. Wie stark eine Kante ist, variiert immer. Schließlich ist es eine der vielen Schönheiten von OOP und Interfaces, etwas zu verwenden, ohne zu wissen, wie es implementiert ist.
Was würde Ihnen in diesem speziellen Beispiel das Wissen über Zeiger bei Referenzen helfen? Es ist ein sehr wichtiges Konzept zu verstehen, dass eine C # -Referenz NICHT das Objekt selbst ist, sondern auf das Objekt verweist.
# 1: Sie übergeben NICHT den Wert
Gut für den Anfang, wenn Sie einen Zeiger verwenden, wissen Sie, dass der Zeiger nur eine Adresse enthält, das war's. Die Variable selbst ist fast leer und deshalb ist es so schön, sie als Argumente zu übergeben. Zusätzlich zum Leistungsgewinn arbeiten Sie mit dem eigentlichen Objekt, sodass alle Änderungen, die Sie vornehmen, nicht vorübergehend sind
# 2: Polymorphismus / Schnittstellen
Wenn Sie eine Referenz haben, die ein Schnittstellentyp ist und auf ein Objekt verweist, können Sie nur Methoden dieser Schnittstelle aufrufen, obwohl das Objekt möglicherweise über viel mehr Fähigkeiten verfügt. Die Objekte können dieselben Methoden auch unterschiedlich implementieren.
Wenn Sie diese Konzepte gut verstehen, dann glaube ich nicht, dass Ihnen zu viel fehlt, wenn Sie keine Zeiger verwendet haben. C ++ wird oft als Sprache zum Erlernen der Programmierung verwendet, da es manchmal gut ist, sich die Hände schmutzig zu machen. Wenn Sie mit Aspekten auf niedrigerer Ebene arbeiten, schätzen Sie auch den Komfort einer modernen Sprache. Ich habe mit C ++ angefangen und bin jetzt ein C # -Programmierer. Ich habe das Gefühl, dass die Arbeit mit rohen Zeigern mir geholfen hat, besser zu verstehen, was unter der Haube vor sich geht.
Ich denke nicht, dass jeder mit Zeigern beginnen muss, aber wichtig ist, dass er versteht, warum Referenzen anstelle von Werttypen verwendet werden, und dass der beste Weg, dies zu verstehen, darin besteht, seinen Vorfahren, den Zeiger, zu betrachten.