Es gibt zwei Probleme, die Sie beachten sollten - beides deutet darauf hin, dass dies eine schlechte Idee ist.
Erstens ist das Erben von .NET BCL-Auflistungstypen in der Regel keine gute Idee. Der Hauptgrund dafür ist, dass die meisten Methoden für diese Typen (wie Add
und Remove
) nicht virtuell sind - und wenn Sie Ihre eigenen Implementierungen in einer abgeleiteten Klasse bereitstellen, werden sie nicht aufgerufen, wenn Sie Ihre Sammlung weitergeben der Basistyp. In Ihrem Fall, indem Sie die Eigenschaft Dictionary<TK,TV>
indexer ausblenden, erstellen Sie eine Situation, in der ein Aufruf mit einer Basisklassenreferenz etwas anderes tut als ein Aufruf mit einer abgeleiteten Klassenreferenz ... eine Verletzung der Liskow-Substitutionsprinzip :
Zweitens und noch wichtiger ist das Erstellen eines Indexers, der ein Element einfügt, wenn Sie versuchen, ein zu finden, völlig unerwartet . Indexer haben die Operationen get
und set
eindeutig definiert. Die Implementierung der Operation get
zum Ändern der Sammlung ist sehr schlecht.
Für den Fall, den Sie beschreiben, ist es viel besser, eine Erweiterungsmethode zu erstellen, die für jedes Wörterbuch geeignet ist. Solch eine Operation ist weniger überraschend in dem, was sie tut, und erfordert auch nicht das Erstellen eines abgeleiteten Sammlungs-Typs:
%Vor% Ohne weitere Informationen darüber, was Sie tun, sieht das für mich wie ein überraschendes Verhalten aus. Ich hoffe, dass Sie aus dem Kontext (d. H. Nennen Sie es AutoInitializingDictionary
oder etwas) sehr klar machen, was zu erwarten ist.
Ich würde es persönlich bevorzugen, dies eher zu einer Methode als zu einem Indexer zu machen; etwas wie D.FindOrCreate
. (Ich habe das Gefühl, dass es einen idiomatischen Namen für eine Methode gibt, die das tut, was ich vorübergehend vergessen habe.)
Ich würde sagen, das verstößt gegen zwei Prinzipien. 1) Prinzip der geringsten Überraschung. Und 2) dass Getter nichts ändern sollten.
Ich würde nicht erwarten, ein Paar {"foo", null} hinzuzufügen, wenn foo nicht in der Sammlung existiert.
%Vor%Der Hauptgrund, warum ich besorgt wäre, ist, dass es nicht threadsicher wäre. Mehrere Leser, die alle gleichzeitig versuchen, in das Dictionary zu schreiben, würden eine sorgfältige Sperrverwaltung benötigen, die Sie wahrscheinlich zuerst nicht für richtig halten (oder richtig machen).
Wann ist es für einen Indexer akzeptabel? um automatisch Elemente zu einem hinzuzufügen Sammlung / Wörterbuch?
Nie
Ist das vernünftig oder gegensätzlich? Best Practices?
Im Gegensatz zu bewährten Verfahren
Wenn die Klasse entsprechend benannt wird, wäre das akzeptabel. Ich würde stattdessen persönlich GetOrAdd verwenden.
Tags und Links c# indexing dictionary collections