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
oder protected
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 sehen List<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. Wenn List<T>
der Hintergrundspeicher abgeleiteten Klassen ausgesetzt wird, kann man leicht eine EditableList<T>
mit einer Methode definieren:
delegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
void ActOnItem<TParam>(int index, ref TParam param, ActByRef<TParam> proc)
{
.. test index, then...
proc(ref _arr[index], ref proc);
}
was dann mit so etwas aufgerufen werden könnte:
int adjustmentAmount = ...;
myList.ActOnItem(index, ref adjustmentAmount,
(ref Point pt, ref int dx) => pt.X += dx );
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 Verwendung double
. Eine solche Aufteilung wäre nicht möglich, wenn List<T>
der Hintergrundspeicher abgeleiteten Klassen ausgesetzt worden wäre .