{bekommen; set;} und Zugriffsmodifikatoren

7

Ich habe gerade angefangen, c # zu lernen, und ich kämpfe ein bisschen mit der Kurzschreibweise von Getter und Setter.

Nach meinem Verständnis sind die beiden folgenden Methoden gleichwertig. Ist das korrekt?

%Vor%

Zweitens, wie funktioniert das, wenn wir verschiedene Zugriffsmodifikatoren auf den Getter / Setter und die Instanzvariable haben wollten. Die folgenden Codefehler, die mir sagen, dass der Accessor restriktiver als die Eigenschaft sein muss und dass ich keine Modifikatoren für Stören-Accessoren angeben kann. Kann jemand bitte klarstellen?

%Vor%

EDIT: Um klarzustellen, habe ich kein bestimmtes Ziel, nur um zu verstehen. Ich verstehe nicht, was diese Kurzschreibweise macht. In anderen Sprachen hatte ich private Instanzvariablen und verwendete öffentliche Getter und Setter, um diese Instanzvariablen zu verwalten. Es erlaubt dies, wenn ich die Methoden selbst schreibe, aber nicht mit dieser Kurzschreibweise. Warum ist das?

EDIT2: Eine letzte Frage, um mein Verständnis zu überprüfen. Die beiden folgenden Codefragmente verwenden Eigenschaften zum Verwalten der Variable maxTime. Der einzige Unterschied zwischen den beiden ist Stil. Ist das korrekt?

%Vor%

vs

%Vor%     
JShell 16.07.2015, 14:41
quelle

5 Antworten

13

Anstelle der falschen private int maxTime { public get; public set; } , Sie können eine Eigenschaft schreiben, die ein privates Feld ausfüllt:

%Vor%

Dies ist nützlich, wenn Sie beim Abrufen oder Festlegen des Werts von maxTime eine Logik anwenden möchten. Wenn nicht, genügt eine einfache Kurzschrift-Eigenschaft:

%Vor%

Sie können eine Eigenschaft mit einem öffentlichen Getter, aber einem privaten Setter wie folgt erstellen:

%Vor%

Dies ist nützlich für schreibgeschützte Eigenschaften, und normalerweise wird die Eigenschaft im Konstruktor der Klasse aufgefüllt.

Sie können sogar eine Eigenschaft erstellen, bei der der Setter öffentlich ist, aber der Getter ist privat, obwohl ich mir kein Szenario vorstellen kann, dass dies nützlich wäre. Darüber hinaus fordern Code-Standards, dass so etwas eine Methode und keine Eigenschaft sein sollte. (lesen Sie dies)

%Vor%

Die Antwort auf Ihre Frage in Edit 2 ist nein.

Der erste Code ändert nie die private int maxTime , während die zweite tut. Wenn Sie jedoch innerhalb Ihrer Klasse nur die Eigenschaft MaxTime verwenden, sind sie funktional gleichwertig.

Aktualisierung:

Seit c # 6 können Sie Kurzschreibeigenschaften ohne Setter schreiben:

%Vor%

Diese Eigenschaften können nur im Konstruktor initialisiert oder wie folgt codiert werden: (auch ein neues Feature von c # 6)

%Vor%

Dies ist nützlich für unveränderbare Eigenschaften (im Gegensatz zu schreibgeschützten Eigenschaften kann sich der Wert einer solchen Eigenschaft selbst innerhalb der einmal initialisierten Hosting-Klasse nicht ändern.

    
Zohar Peled 16.07.2015, 14:46
quelle
6
%Vor%

Die obigen 2 Methoden sind nicht äquivalent.

Es wäre genauer, sie so zu vergleichen:

%Vor%

Und wenn Sie mit Zugriffsmodifikatoren spielen möchten, wie zB get public und set private, dann würden Sie das so machen:

%Vor%

Weitere Informationen zu Auto-Implemented Properties und die Compilermagie, die hinter den Kulissen abläuft.

    
sstan 16.07.2015 14:46
quelle
3
%Vor%

Was Sie haben, ist Auto-Implemented-Eigenschaft , die intern ein unterstützendes privates Feld (und Kompilierzeitmethoden für get / set) haben würde.

In C # -Code entspricht dies:

%Vor%

Bei der Kompilierung werden get / set in Methodenaufrufe konvertiert, etwas ähnlich wie das, was Sie haben.

Für:

%Vor%

Der Fehler ist ziemlich klar, Sie können nicht weniger einschränkende Zugriffsspezifizierer als die Eigenschaft selbst haben. Zum Beispiel, wenn Ihre public -Eigenschaft eine public get haben soll, aber wenn Sie nur erlauben wollen, die Eigenschaft innerhalb der Klasse zu setzen, können Sie folgendes tun:

%Vor%

Sie sollten auch sehen: .Net Namenskonventionen , es wäre besser, wenn Sie dem folgen, so dass Sie den Namen Ihrer Eigenschaft mit einem Großbuchstaben beginnen lassen können.

    
Habib 16.07.2015 14:48
quelle
2

Die erste Methode ist einfach C # syntaktischer Zucker für eine automatisch implementierte Eigenschaft. Es bietet eine Implementierung der entsprechenden Accessoren, wenn Sie es kompilieren.

Das zweite Beispiel ist anders. Hier haben Sie ein Public-Scope-Feld (in der Regel ein No-No wegen des Kapselungsprinzips) und zwei Methoden , die auf die Variable zugreifen. Es gibt einen subtilen Unterschied in der semantischen Verwendung; Normalerweise werden Eigenschaften verwendet, um den Zustand zu exponieren, während eine Methode normalerweise anzeigt, dass die Methode einige Berechnungen hinter sich hat und nicht nur den aktuellen Zustand zurückgibt oder ändert (auch dies ist eine Konvention, keine harte Regel). Methoden werden normalerweise mit der VerbAction-Namensgebung (public Thing GetAThing () {}) formatiert.

Automatisch generierte Eigenschaften können verschiedene Zugriffsmodifizierer haben, aber das get oder set weniger zugänglich machen als den Gesamtmodifikator.

%Vor%     
Matt 16.07.2015 14:50
quelle
1

Wenn Sie eine Eigenschaft wie in Methode 1 verwenden (öffentlicher Stringname {get; set;}), generiert der Compiler automatisch eine private Backing-String-Variable und öffentliche Getter- und Setter-Methoden.

Die allgemeine Idee besteht darin, Felder privat zu machen und den Zugriff nur über öffentliche Getter / Setter-Methoden zu erlauben. Also, wenn Sie Methode 2 verwenden, deklarieren Sie die Variable privat.

Ich würde empfehlen, ILDASM zu verwenden, um die erzeugte IL zu untersuchen, es hilft zu sehen, was unter der Haube vor sich geht.

Der zweite Fehler ist einfach, was der Compiler sagt. Die Sichtbarkeit der Konstrukte muss konsistent sein

    
Volkan Paksoy 16.07.2015 14:50
quelle

Tags und Links