Ich bin etwas neu in C # und habe gerade herausgefunden, dass: In C # sind alle Felder und Methoden in einer Klasse standardmäßig privat. Das bedeutet, dass dies:
class MyClass
{
string myString
}
ist das gleiche wie:
class MyClass
{
private string myString
}
Sollte ich das Schlüsselwort private für Felder und Methoden verwenden, weil sie gleich sind? Viele Online-Codebeispiele verwenden das Schlüsselwort private in ihrem Code. Warum ist das so?
c#
programming-practices
coding-style
code-quality
user3210251
quelle
quelle
private
. Es führt zu weniger kognitiven Dissonanzen für mich, wenn ich immer erwarten kann, dass der Bereichsspezifizierer als erster Teil einer Bezeichnerdeklaration angezeigt wird. Ich brauche weniger Zeit, um "privat" zu lesen, als um herauszufinden, dass das erste Wort kein Bereichsspezifizierer ist, und das bedeutet, dass es sich um eine private Mitgliedererklärung handelt. Beim Schreiben von Code muss es auch später gelesen werden.Antworten:
Nur weil Sie Zeilenvorschübe und Einrückungen weglassen können und Ihr C # -Compiler immer noch versteht, was Sie ihm sagen möchten, ist dies nicht automatisch eine gute Idee.
ist für den menschlichen Leser viel weniger lesbar als:
Und das ist der springende Punkt hier - Programme sind für zwei Zielgruppen geschrieben:
Letzterer ist derjenige, der die Bedeutung des Geschriebenen verstehen und schnell erfassen muss . Aus diesem Grund haben sich im Laufe der Jahre einige bewährte Verfahren herausgebildet, die mehr oder weniger allgemein als Quasi-Standards anerkannt sind. Eines davon ist das Setzen expliziter Bereichsschlüsselwörter, ein anderes Beispiel das Setzen zusätzlicher Klammern um komplexe Ausdrücke, selbst in Fällen, in denen sie syntaktisch nicht benötigt würden, wie z.
quelle
5 + 5 * 5
ist30
, nicht50
wie einige vielleicht auf den ersten Blick erwarten.**private** static void Main()
? :)C # ist nicht die einzige Programmiersprache für .NET. Andere Sprachen können und haben in verschiedenen Kontexten unterschiedliche Standardzugriffsmöglichkeiten. Durch die Angabe
private
wird jedem, der den Code liest , klar, dass eine solche Zugänglichkeit beabsichtigt ist, während durch das Weglassen der Angabe die Frage offen bleibt, ob das Mitglied möglicherweise innerhalb der Assembly verwendet werden soll [wie dies in VB.NET die Standardeinstellung wäre]. . Explizit zu sein kann besonders nützlich sein, wenn mehrere Sprachen mit unterschiedlichen Regeln verwendet werden.In Bezug darauf, ob in Ermangelung eines besonders zwingenden Arguments zugunsten des anderen bevorzugt werden sollte
private
oderprotected
sollte, sollte die Entscheidung darauf beruhen, ob es wahrscheinlicher ist, dass die Enthüllung eines Mitglieds es einer abgeleiteten Klasse ermöglicht, etwas Nützliches zu tun wäre sonst nicht möglich oder würde verhindern, dass zukünftige Versionen einer Klasse ihre internen Datenstrukturen auf eine Weise ändern, die effizienter wäre. Man kann Beispiele für beide Situationen in sehenList<T>
.In einigen Fällen
Point
kann es hilfreich sein, Elemente an Ort und Stelle zu aktualisieren , wenn eine Liste von Aggregaten (z. B. Strukturen) vorhanden ist. WennList<T>
der Hintergrundspeicher abgeleiteten Klassen ausgesetzt wird, kann man leicht eineEditableList<T>
mit einer Methode definieren:was dann mit so etwas aufgerufen werden könnte:
Ein solches Verfahren könnte effiziente Aktualisierungen auch bei relativ großen Strukturtypen ermöglichen [da kein Kopieren erforderlich wäre]. Die Tatsache, dass
List<T>
seine Interna nicht verfügbar gemacht werden, macht es unmöglich, eine Klasse abzuleiten, die einen solchen Operator effizient implementieren könnte.Auf der anderen Seite, obwohl Microsoft diese Fähigkeit
List<T>
meines Wissens noch nicht ausgenutzt hat, würde eine private Version des Backing Store es ermöglichen , den Backing Store in Teile aufzuteilen, die bei Verwendung der meisten Daten kleiner als 85 KB waren Typen oder kleiner als 1000 Elemente bei Verwendungdouble
. Eine solche Aufteilung wäre nicht möglich, wennList<T>
der Hintergrundspeicher abgeleiteten Klassen ausgesetzt worden wäre .quelle
int myField
undprivate int myField
unterschiedlich ist. Daher glaube ich nicht, dass das Hinzufügen von Private für Interpretationen für andere .NET-Sprachen offen bleibt.Ja, Sie sollten es verwenden :) Das
private
Schlüsselwort wird verwendet, da es allgemein anerkannt ist und alle Zweifel am beabsichtigten Umfang eines Klassenmitglieds beseitigt.Die Lesbarkeit von Code ist sehr wichtig, insbesondere wenn Sie in einem Team arbeiten. Wenn Sie die Lesbarkeit von Code genauer untersuchen möchten, kann ich Ihnen The Elements of C # Style als gutes Nachschlagewerk empfehlen .
quelle
Frage:
"Sollten Sie jemals private Felder und Methoden in C # verwenden?"
Schnelle Antwort:
Ja, aber das hängt von Ihrer Codelogik ab.
Langweilige erweiterte Antwort:
Ich schlage vor, immer die Sichtbarkeit für Mitglieder anzugeben.
Ich denke, es ist ein guter Ansatz, Mitglieder standardmäßig als "privat" zu deklarieren.
In der realen Welt verwende ich stattdessen "geschützt".
Früher oder später könnte dieses versteckte Mitglied von einer Unterklasse verwendet werden.
Manchmal kann eine gute Frage besser beantwortet werden, indem die entgegengesetzte Frage gestellt wird.
Die entgegengesetzte Frage zu Ihrer Frage könnte etwa so lauten:
"Sollte ich für Felder und Methoden in C # immer den Modifikator" Öffentlicher Zugriff "verwenden?"
In anderen Programmiersprachen können Sie je nach Design öffentlich für die Öffentlichkeit "werben".
Ich verwende viele (visuelle) Steuerungsbibliotheken für tiefe Hierarchien, in denen einige Mitglieder (Eigenschaften, Methoden) erforderlich sind.
Manchmal ist es besser, sie öffentlich zu haben, manchmal nicht.
quelle