Gibt es einen Grund, das Schlüsselwort "privat" in C # zu schreiben?

109

Soweit ich weiß, privateist der Standard überall in C # (was bedeutet , dass , wenn ich nicht schreiben public, protected, internaletc. es wird privatestandardmäßig aktiviert ). (Bitte korrigieren Sie mich, wenn ich falsch liege.)

Was ist der Grund, dieses Schlüsselwort zu schreiben, oder warum gibt es es überhaupt für Mitglieder?

Wenn ein Ereignishandler beispielsweise automatisch generiert wird, sieht er folgendermaßen aus:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Aber warum schreibt es überhaupt privat, wenn dies impliziert und standardmäßig ist? Nur damit unerfahrene Entwickler (die nicht wissen, dass es sich um den C # -Standard handelt) wissen, dass es privat ist? Oder gibt es einen Unterschied für den Compiler?

Darüber hinaus gibt es einen Fall , in den „privaten“ (allein) Schreiben wird die Zugänglichkeit des Elements ändern?

Camilo Martin
quelle
18
IIRC, ein "Top-Level" -Typ, ist jedoch internalstandardmäßig.
Jeff Mercado
4
Die Standardeinstellung für alles ist nicht privat, wie angegeben, und als allgemeine Faustregel ist es besser, explizit zu sein.
James Michael Hare
Die Standardeinstellung für alles ist "so privat wie möglich". Offensichtlich kann eine nicht verschachtelte Klasse nicht privat sein, oder nichts kann sie instanziieren oder verwenden. Mitglieder sind jedoch standardmäßig privat, und verschachtelte Klassen sind standardmäßig privat. Alles in C # hat standardmäßig die eingeschränkteste Sichtbarkeit, die es haben kann.
Ryan Lundy

Antworten:

171

AFAIK, privat ist die Standardeinstellung in C # (was bedeutet, dass wenn ich nicht öffentlich, geschützt, intern usw. schreibe, es standardmäßig privat ist). (Bitte korrigieren Sie mich, wenn Sie falsch liegen).

Das ist nicht wahr. In einem Namespace definierte Typen (Klassen, Strukturen, Schnittstellen usw.) sind standardmäßig intern . Außerdem haben Mitglieder in verschiedenen Typen unterschiedliche Standardzugriffsmöglichkeiten (z. B. public für Schnittstellenmitglieder). Weitere Informationen finden Sie unter Eingabehilfen auf MSDN.

Ebenfalls,

Was ist der Grund, dieses Schlüsselwort zu schreiben, oder warum existiert es überhaupt?

Wenn Sie dies explizit angeben, können Sie Ihre Absicht angeben, den Typ sehr explizit privat zu machen. Dies hilft bei der Wartbarkeit Ihres Codes im Laufe der Zeit. Dies kann anderen Entwicklern (oder Ihnen selbst) helfen, zu wissen, ob ein Mitglied standardmäßig oder absichtlich privat ist usw.

Reed Copsey
quelle
1
@ Wayne: Er hat eine Antwort mit einer höheren Punktzahl als Jon Skeet, aber er hat es nicht verdient ... Die Jon-Antwort ist viel genauer.
Aleroot
2
Dies ist eine sinnlose Unterscheidung. Typen in einem Namespace sind standardmäßig intern, da sie standardmäßig nicht privat sein können. sonst könnte nichts sie gebrauchen. Sie sind standardmäßig immer noch so eingeschränkt wie möglich.
Ryan Lundy
1
Der Zugriff der Standardmitglieder für inisde-Klassen und -Strukturen ist privat. Überprüfen Sie hier: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca
Elemente in einem Namespace können es jedoch nicht sein private.
Shimmy Weitzhandler
Auch getund setstandardmäßig auf die Zugänglichkeit der Eigenschaft selbst
AustinWBryan
119

AFAIK, privat ist die Standardeinstellung überall in C #

Nicht ganz - die Standardeinstellung ist "der am stärksten eingeschränkte Zugriff, der für diese Deklaration verfügbar ist". So ist beispielsweise bei einem Typ der obersten Ebene die Standardeinstellung internal: Für einen verschachtelten Typ ist der Standardwert private.

Was ist der Grund, dieses Schlüsselwort zu schreiben, oder warum existiert es überhaupt?

Es macht es explizit, was aus zwei Gründen gut ist:

  • Es macht es für diejenigen klarer, die die Standardeinstellungen gemäß Ihrer Frage nicht kennen (ich persönlich habe dieses Argument nie gemocht, aber ich dachte, es ist erwähnenswert).
  • Es entsteht der Eindruck, dass Sie sich bewusst dafür entschieden haben, es privat zu machen, anstatt nur die Standardeinstellungen zu übernehmen.

Wie für Ihren letzten Teil:

Gibt es außerdem einen Fall, in dem das Schreiben von "privat" (allein) die Zugänglichkeit des Mitglieds verändert?

Ja, um die Hälfte einer Immobilie restriktiver zu gestalten als die andere:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

Ich verwenden , mit Ausfällen zu gehen überall konnte ich, aber ich habe davon überzeugt, (teilweise von Eric Lippert) , dass macht es klar , dass Sie darüber nachgedacht haben und beschlossen , etwas privat zu machen ist eine gute Idee.

Persönlich wünsche ich es gab , dass eine Art und Weise zu tun , für versiegelte / entsiegelt auch für Typdeklarationen - möglicherweise nicht einmal hat eine Standard. Ich vermute, dass viele Entwickler (ich selbst eingeschlossen, wenn ich nicht aufpasse) Klassen nicht versiegelt lassen, nur weil es weniger Aufwand ist, sie zu versiegeln.

Jon Skeet
quelle
+1. Die Verwendung von ansonsten irrelevanten Schlüsselwörtern zum Signalisieren der semantischen Absicht ist nützlich, obwohl mein Java-Hintergrund die Verwendung finaleines typischeren Beispiels ermöglicht.
jprete
1
@minitech: Der umgekehrte Weg funktioniert auch, ist aber weniger nützlich. Dies alles wurde in C # 2 eingeführt.
Jon Skeet
20
Ich wünschte, es gäbe überhaupt keine Standardeinstellungen und der Compiler hat nur einen Fehler ausgegeben, wenn der Zugriffsmodifikator fehlte. Ich glaube nicht, dass die meisten Leute die Standardeinstellungen für jede Situation kennen, was dann zu unbeabsichtigten Fehlern führt.
+1 "Für einen verschachtelten Typ ist der Standardwert privat" - das weiß ich nur, wenn ich Ihre Antwort lese. Vielen Dank!
Nordin
5
@Phong, für C # gibt es eine einfache Regel: Standardmäßig ist alles so privat wie möglich. Elemente in einem Namespace wie nicht verschachtelte Klassen können nicht privat sein, da sie von nichts verwendet werden können. Sie können nur intern oder öffentlich sein; Standardmäßig sind sie also intern. Dinge innerhalb anderer Dinge (Aufzählungen innerhalb einer Klasse; verschachtelte Klassen; Eigenschaften; Felder; Methoden ...) sind standardmäßig privat.
Ryan Lundy
11

privatefügt visuelle Unordnung hinzu. Für diejenigen, die darauf bestehen, dass es die Dinge explizit macht, würde ich fragen: Tun Sie das auch mit Mathematik? Zum Beispiel:

var answer = a + b / c;

Finden Sie das unklar ohne redundante Klammern b / c?

Die Regel in C # ist sehr einfach: Standardmäßig ist alles so nah wie möglich an privat. Also , wenn Sie etwas brauchen , um mehr zu sehen als der Standard, fügen Sie einen Modifikator. Andernfalls fügen Sie Ihrem Code keine unnötigen Schlüsselwörter hinzu.

Ryan Lundy
quelle
1
Ich habe diesem Recht zugestimmt, bevor ich die Frage gestellt habe. Aber manche Leute schreiben VB, manche C ++, manche sogar F # (vielleicht aus anderen funktionalen Sprachen wie Haskell?), Besser als auf C #. Für sie (und für uns, wenn wir es nach 2 Jahren ohne C #ING vergessen) ist es besser, wenn Accessoren explizit sind. Unterschätzen Sie nicht die Auswirkungen, die einfaches Lernen auf ein Projekt hat. Viele Entwickler haben einen Hintergrund, der möglicherweise nicht das Werkzeug ihrer Wahl widerspiegelt, und sie benötigen Lernhilfen, auch im Produktionscode. Dies ist überhaupt nicht schlecht (und wir kennen viele Code sehr schlechtes C #, also helfen uns auch ein paar Hilfsmittel).
Camilo Martin
3
Nun, sicher, in VB sind die Standardeinstellungen grausam. Ich denke, die Standardsichtbarkeit ist Friendzum Beispiel für Mitglieder. C # macht seine Sichtbarkeit standardmäßig richtig: Die Dinge sind auf die geringstmögliche Sichtbarkeit eingestellt, sofern sie nicht geändert werden. Nach allem, was ich finden kann, scheint dies auch für C ++ zu gelten (außer für Strukturen). (Es scheint nicht wahr zu sein für F #.)
Ryan Lundy
6
Es ist seltsam für mich, dass so viele Menschen dafür sind var, weil es die visuelle Unordnung verringert, und dennoch sind so viele Menschen dafür, sinnlos zu tippen private.
Ryan Lundy
2
Ich würde sogar so weit gehen zu argumentieren, dass visuelle Unordnung die Lesbarkeit beeinträchtigt!
Binki
1
upvoted obwohl ich keine Klammern im Fall Ihre mathematischen Beispiel verwenden möchten.
März 2377
7

Soweit ich weiß, ist privat überall in C # die Standardeinstellung.

Wenn Sie explizit privat deklarieren , wissen Sie, dass es privat ist. Denken Sie nicht nur, dass es so ist, denn soweit Sie wissen, ist es die Standardeinstellung. Dies bedeutet auch, dass jemand anderes, der sich den Code ansieht, weiß, was er ist.

Es gibt kein "Ich denke es ist", "Ich bin mir ziemlich sicher, dass es ist" usw. Es ist einfach so . Und jeder ist auf der gleichen Seite.

Ich bin kein C # -Entwickler. Wenn ich mit Code arbeiten müsste , der nicht explizit als privat deklariert wurde , würde ich wahrscheinlich annehmen, dass er intern ist .

Ich mag es nicht, wenn Dinge implizit festgelegt sind. Es ist nie so klar wie wenn sie explizit festgelegt sind.

JD Isaacks
quelle
Klingt vernünftig, ich vergesse sogar die Grundlagen von Sprachen, die ich einmal besser kannte.
Camilo Martin
6

Lesbarkeit - Möglicherweise weiß nicht jeder, dass privat das Standardverhalten ist.

Absicht - Gibt einen klaren Hinweis darauf, dass Sie die Eigenschaft ausdrücklich als privat deklariert haben (aus welchem ​​Grund auch immer).

James
quelle
5

Lesbarkeit und Absichtserklärung sind zwei gute Gründe, die mir einfallen.

Maess
quelle
Einverstanden. Wenn Sie beispielsweise mit anderen Entwicklern an einem Code arbeiten, hilft es, etwas auf privat zu setzen, um Ihre Absicht anzuzeigen. Dies ist auch hilfreich, wenn Sie nach einigen Jahren wieder in Ihren Code zurückkehren und Ihre IDE Ihnen mitteilen kann, welche Methoden für diese Klasse öffentlich zugänglich sein sollen.
Aaron Newton
3

Ein guter Grund für die explizite Angabe der Sichtbarkeit ist, dass Sie nicht über die Standardeinstellung für den Kontext nachdenken müssen, in dem Sie sich befinden.

Ein weiterer guter Grund ist, dass FxCop Sie dazu auffordert.

Patrick McDonald
quelle
+1, ich habe gerade bemerkt, dass FxCop sich darüber beschwert hat, dass ich den privaten Modifikator jetzt entferne, als ich mit der Änderung gebaut habe.
Camilo Martin
2

Viele Leute (Leute wie ich!) Programmieren regelmäßig in einer Handvoll verschiedener Sprachen. Wenn ich mit solchen Dingen explizit bin, muss ich mich nicht an alle arkanen Details aller Sprachen erinnern, in denen ich programmiere.

davidtbernal
quelle
1
Nun, ich würde nicht sagen, dass "Standardzugriffsmodifikator ist private" ein arkanes Detail ist ... Aber ich verstehe den Punkt. Neulich fiel es mir schwer, mich daran zu erinnern, wie das Framework, das ich letzte Woche verwendet habe ( MEF ), funktioniert hat.
Camilo Martin
0

Ich würde aus Gründen der Übereinstimmung mit der Lesbarkeit des Umfangs des Restes der Klasse sagen.

MGZero
quelle
4
Sie denken an C ++. In C # sind Mitglieder auch in Strukturen standardmäßig privat.
3
Strukturen sind standardmäßig nicht öffentlich zugänglich - siehe: msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey