Ich habe eine Frage zu "Best Practices" zu OOP in C # (diese gilt jedoch für alle Sprachen).
Erwägen Sie, eine Bibliotheksklasse mit einem Objekt zu haben, das öffentlich zugänglich gemacht werden soll, z. B. über den Eigenschaften-Accessor. Wir möchten jedoch nicht, dass die Öffentlichkeit (Benutzer dieser Bibliotheksklasse) dies ändert.
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
Offensichtlich ist der beste Ansatz "Option C", aber nur sehr wenige Objekte haben die ReadOnly-Variante (und sicherlich keine benutzerdefinierten Klassen haben sie).
Wenn Sie der Benutzer der Klasse A wären, würden Sie Änderungen an erwarten
List<string> someList = ( new A() ).Items;
auf ursprüngliches (A) Objekt übertragen? Oder ist es in Ordnung, einen Klon zurückzugeben, sofern er in Kommentaren / Dokumentationen so geschrieben wurde? Ich denke, dass dieser Klonansatz zu ziemlich schwer zu verfolgenden Fehlern führen könnte.
Ich erinnere mich, dass wir in C ++ const-Objekte zurückgeben konnten und Sie nur Methoden aufrufen konnten, die als const darauf markiert waren. Ich denke, es gibt keine solche Funktion / Muster in der C #? Wenn nicht, warum würden sie es nicht aufnehmen? Ich glaube, es heißt konstante Korrektheit.
Andererseits ist meine Hauptfrage "Was würden Sie erwarten" oder wie man mit Option A gegen B umgeht.