Ist FxCop der CollectionPropertiesShouldBeReadOnly Regel unvereinbar mit dem Federrahmen?

StackOverflow https://stackoverflow.com/questions/206746

  •  03-07-2019
  •  | 
  •  

Frage

FxCop hat die CollectionPropertiesShouldBeReadOnly Regel , die beschwert sich, wenn Ihre Klasse eine Art hat Sammel Eigenschaft, die Kunden einstellen. Stattdessen schlägt es die Eigenschaft macht schreibgeschützt und löscht () -Methode liefert und Add () oder AddRange () Methoden für den Inhalt der Sammlung zu ändern.

Ich bin damit einverstanden, dass für eine sauberere macht und kontrollierte Schnittstelle, aber ich bin zu kämpfen, dass die Schnittstelle Arbeit mit dem Spring-Framework zu machen. Wenn ich ein Objekt mit einer Sammlung von Mitarbeitern konfigurieren möchten, muss ich einige Sammlungseigenschaft aussetzen, um die Mitarbeiter in injizieren. Ich habe noreferrer"> Früjahr Dokumentation durch FxCop Forum .

War es hilfreich?

Lösung

Wenn die Sammlung Eigenschaft hat nur ein Getter ausgesetzt, werden wir die FxCop übernehmen empfohlenen Muster, die Sie Liste verwendet wird, und zu der Sammlung. Das erste Muster wird ebenfalls unterstützt.

Für allgemeine Sammlungen dies nur funktioniert, wenn die freiliegende Eigenschaft des Typs IList ist. Wir haben eine JIRA Ausgabe für die nächste Version dieses Problem zu beheben. BTW, ist dies ein sehr häufiges Muster in den Basisklassenbibliotheken (wie Sie wahrscheinlich wissen ...) das ist, wo wir zum ersten Mal die Notwendigkeit begegnet diesen Stil in .NET 1.1 zu unterstützen (die sich aus der Beschränkung nicht oben aufgeführten leiden) .

Cheers, Mark

Andere Tipps

Ist das Problem so schlecht, wie Sie denken? Mein Verständnis ist, dass FxCop wird sich beschweren, wenn Sie eine Lese- / Schreib-Eigenschaft wie folgt:

public List<Foo> Items { get; set; }

... weil die Benutzer Ihrer Klasse wären dann in der Lage sein, dies zu tun:

myInstance.Items = new List<Foo>();

Natürlich wollen Sie nicht Benutzer Ihrer Klasse vollständig die Liste zuweisen. FxCop empfiehlt daher, dieses Muster:

private List<Foo> _items = new List<Foo>();
public List<Foo> Items { get { return _items; } }

So, jetzt Benutzer Ihrer Klasse können nur Elemente aus der Liste hinzufügen und entfernen, anstatt sie mit einer neuen Instanz Liste überschrieben werden.

Wie implementieren Spring.NET seine Sammlung Eigenschaften? Sind sie wirklich wie mein erstes Beispiel lesen / schreiben? Wenn ja, würde es interessant sein, ihre Anwendungsfälle für ein solches Muster zu sehen, weil es sich nicht richtig zu sein scheinen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top