Eigenschaften vs Öffentliche Membervariablen [duplizieren]

7

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.

    
user1230593 08.08.2012, 22:55
quelle

6 Antworten

7

Eigenschaften können Nebenwirkungen haben, sie liefern syntaktischen Zucker um 'Getter' und 'Setter' Methoden.

%Vor%

Eigenschaften können auch unterschiedliche Schutzebenen für get und set haben, dies ist mit Feldern nicht möglich.

%Vor%     
IanNorton 08.08.2012, 22:58
quelle
10

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).

    
Charleh 08.08.2012 22:59
quelle
10

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.

    
Dai 08.08.2012 23:07
quelle
3

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).

    
paulsm4 08.08.2012 22:57
quelle
1

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.

    
DeanOC 08.08.2012 23:05
quelle
0

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)

    
Neil Thompson 08.08.2012 22:59
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '409301',
    'url' => 'properties-vs-public-member-variables',
];

$_SESSION = [
    '__flash' => [],
];