Ich habe eine Klasse in C #, die ein Dictionary enthält, das ich erstellen möchte und sicherstellen, dass nichts hinzugefügt, bearbeitet oder aus diesem Wörterbuch entfernt wird, solange die Klasse, die es enthält, existiert.
readonly hilft nicht wirklich, sobald ich getestet und gesehen habe, dass ich Gegenstände nachher hinzufügen kann. Ich habe zum Beispiel ein Beispiel erstellt:
%Vor%Ich möchte, dass die Add-Methode nicht funktioniert. Wenn möglich, möchte ich es nicht einmal kompilieren. Irgendwelche Vorschläge?
Eigentlich mache ich mir Sorgen, dass es Code ist, der vielen Menschen offen steht, sich zu ändern. Also, auch wenn ich die Add-Methode verberge, ist es möglich, dass jemand "unschuldig" eine Methode erstellt, die einen Schlüssel hinzufügt oder einen anderen entfernt. Ich möchte, dass die Leute schauen und wissen, dass sie das Wörterbuch in keiner Weise ändern sollten. Genau wie ich mit einer const-Variable habe.
Es gibt nichts im .NET Framework, das Ihnen hier hilft, aber dieser Beitrag gibt eine ziemlich gute Implementierung eines generischen ReadOnlyDictionary
in C #. Es implementiert alle Schnittstellen, die Sie erwarten könnten ( IDictionary
, ICollection
, IEnumerable
, usw.) und als Bonus wird die gesamte Klasse und ihre Mitglieder vollständig mit XML kommentiert.
(Ich habe davon Abstand genommen, den Code hier zu posten, weil er mit all den XML-Kommentaren ziemlich lang ist.)
Verstecke das Wörterbuch total. Stellen Sie einfach eine get-Methode für die DictContainer-Klasse bereit, die Elemente aus dem Wörterbuch abruft.
%Vor%Eh ... dann definiere nicht die Add-Methode ...
Behalten Sie die Variable myDictionary
privat und setzen Sie einen Getter / Indexer frei, so dass er nur von außerhalb dieser Klasse gelesen werden kann.
fragt sich, ob er den Punkt vollständig vermisst
Es gibt keine integrierte Möglichkeit, dies zu tun. Ziehen Sie eine Wrapperklasse in Betracht. >
Es gibt jetzt eine Möglichkeit, eine schreibgeschützte Sammlung zu implementieren, die für die Klasse statisch ist. Hier ist mein Code:
%Vor%Ich hoffe, das hilft.
zum Hinzufügen von benutzerdefinierten Elementen;
%Vor%Ich mochte den Link von bruno-conde , das war ein einfacheres, aber ich kann seinen Kommentar nicht als Antwort markieren Ich werde Noldorin als offizielle Antwort markieren, denn es ist eine ähnliche und befriedigende Antwort.
Schade, dass es keine Möglichkeit gibt, die Kompilierung des Codes zu verhindern :(. Danke, Leute
Hier ist eine bessere Alternative, wie ich es beschrieben habe:
Ссылка ..
Im Wesentlichen ist es eine viel einfachere Lösung, ReadOnlyCollection abzuleiten, wodurch die Arbeit auf elegantere Weise erledigt wird.
Tags und Links .net c# dictionary immutability readonly