Ich bin ein Anfänger Programmierer und ich habe alles über Klasseneigenschaften gelesen. Books gibt an, dass Eigenschaften den indirekten Zugriff auf Membervariablen ermöglichen. Ok, was macht es anders als nur das Feld zu veröffentlichen und direkt darauf zuzugreifen?
Hier ist ein Zitat aus Learning C # 3.0 von Jesse Liberty:
Zum Beispiel möchten Sie möglicherweise extern Klassen, um einen Wert lesen, aber nicht ändern zu können; oder du möchtest vielleicht schreiben einige Code, so dass das interne Feld nur Werte in einem bestimmten Bereich akzeptieren kann. Wenn du Gewähren Sie externen Klassen freien Zugriff auf Ihre Mitgliedsfelder, Sie können keine davon kontrollieren.
Ich verstehe nicht, was er hier sagt. Kann jemand das weiter erklären oder ein Beispiel geben, warum ich eine Immobilie nutzen möchte, anstatt das Feld öffentlich zu machen? So wie ich es jetzt verstehe, würden sie beide genau das Gleiche erreichen ... also vermisse ich hier offensichtlich etwas.
Er sagt, dass Eigenschaften einen Getter liefern können, aber keinen Setter, so dass sie zum Beispiel schreibgeschützt sind (
)Eigenschaften sind nur syntaktischer Zucker für eine Methode z.B.
%Vor%ist nur Zucker für
%Vor%Dies bedeutet, dass Property Setter / Getter Logik anwenden können, die ein bloßes öffentliches Feld nicht kann
Edit: Ich bin nicht genau sicher, welche Feldnamen die CLR gibt die Hintergrundfelder für Auto-Eigenschaften - es ist nur ein Beispiel:)
Bearbeiten2:
Ein Beispiel für eine schreibgeschützte Eigenschaft:
%Vor%und schließlich eine öffentliche Lese - private Schreib (für autoproperties)
%Vor%Wirklich nützlich, wenn Sie nicht in der Lage sind, ein Hintergrundfeld einzugeben in:)
Denken Sie nur daran, wenn Sie die Möglichkeit haben, Logik auf ein Mitglied anzuwenden, dann ist eine Eigenschaft der richtige Weg. Auf diese Weise funktionieren viele Frameworks (z. B. das Verfolgen von "schmutzigen" Objekten, indem eine Eigenschaft verwendet wird, um einer Art von Objektmanager mitzuteilen, dass sich etwas geändert hat; dies wäre mit einem öffentlichen Feld nicht möglich).
Die anderen Antworten, die bisher zur Verfügung gestellt wurden, liefern Details zu den Vorteilen der Accessor / Mutator-Logik, aber alle scheinen den ideologischen Punkt bezüglich der Objektkapselung zu verfehlen.
Sie sehen, Klassenmitgliedsfelder sind ein Implementierungsdetail. Wenn Sie beispielsweise eine Klasse haben, die eine Auflistung darstellt, können Sie sie als verknüpfte Liste implementieren (und den Stammknoten über ein öffentliches Feld verfügbar machen), oder Sie können sie als resizierbares Array implementieren und das Element index0 verfügbar machen / p>
Das Problem bei der Offenlegung von Implementierungsdetails besteht darin, dass Sie jede Art von definierter Schnittstelle zwischen Ihrer Klasse und ihren Konsumenten verlieren. Indem Sie sicherstellen, dass alle Operationen über definierte Methoden (gesteuert von der Klasse selbst) ausgeführt werden, erleichtern Sie die Arbeit mit und sorgen für eine langfristige Sichtweise. Beispielsweise können Sie Ihre Sammlungsimplementierung viel einfacher von einem Typ (der verknüpften Liste) in einen anderen (das Array) konvertieren, ohne Verträge mit den Konsumenten Ihrer Klasse zu brechen.
Machen Sie sich keine Sorgen über die Auswirkungen von trivialen Accessor / Mutator-Methoden auf die Performance: Der JIT-Compiler wird die Property-Methoden inline einbinden. Wenn Sie einige Benchmarks ausführen, sehen Sie, dass die Leistung von Eigenschaften und Feldern identisch ist.
Es gibt eine Reihe wichtiger Unterschiede zwischen "Eigenschaften" und "Mitgliederzugriff".
Das Wichtigste ist, dass Sie einem Mitglied über eine Eigenschaft Schreibschutz gewähren können (Sie können auf den Status zugreifen, Sie können ihn jedoch nicht ändern). Genau wie die Methoden "getter ()" und "setter ()" in Java.
Sie können auch einen berechneten Wert aus einer Eigenschaft zurückgeben (generieren Sie einen Wert "on-the-fly", als wäre es eine Variable).
Eigenschaften können so konfiguriert werden, dass:
Sie sind schreibgeschützt, Public MyProp {get;}
sie sind schreibgeschützt Public MyProp {set;}
sie sind für externe Objekte lesbar, können aber nur von den Interna der Klasse gesetzt werden
Öffentlich MyProp {get; private set;}
Wie andere geschrieben haben, können Sie auch Logik in Ihre Getter und Setter einfügen. Zum Beispiel können Sie vor dem Setzen der Wette auf einen neuen Wert prüfen, ob der Wert akzeptabel ist.
Sie können nichts davon mit einem öffentlichen Feld tun.
Grundsätzlich ist ein öffentliches Feld die dümmste Art von Eigenschaft, die Sie haben können. Vorausgesetzt, dass .Net jetzt Autobacking-Felder für Ihre Eigenschaften zulässt. Es gibt keinen Grund mehr, öffentliche Felder zu verwenden.
Wenn Sie Public Int MyAge
haben
Ich kann es auf -200 oder 20.000 setzen und es gibt nichts, was Sie dagegen tun können.
Wenn Sie eine Eigenschaft verwenden, können Sie überprüfen, ob das Alter zwischen 0 und 150 liegt.
Edit: nach IanNortons Beispiel (Mann, das war schnell)
Tags und Links c# public properties private