2016-03-31 12 views
1

die folgende Klasse Gegeben:Was sind die Nachteile dieses Musters, um Unveränderbarkeit zu erzwingen?

public static class ComboModel 
{ 
    public static Dictionary<int, int[]> Items() 
    { 
     return new Dictionary<int, int[]> 
     { 
      { 
       1, 
       new[] { 
        2, 
        3, 
        4 
       } 
      } 
     }; 
    } 
} 

I Unveränderlichkeit der Daten in der Klasse sichern wollen, aber das fühlt sich an Javascript-y und hat einige vage (aber stark) Kritik von meinen Kollegen gezogen. Was ist daran falsch?

+1

Sieht wirklich komisch aus. –

+10

Nun wird es jedes Mal zugewiesen, wenn die Methode aufgerufen wird. Vielleicht verwenden Sie stattdessen stattdessen ein ['ImmutableDictionary'] (https://msdn.microsoft.com/en-us/library/dn467181 (v = vs.111) .aspx)? – vcsjones

+1

Es verwendet auch viele Zeilen im Editor-Puffer;) – Dai

Antwort

4

Nur ReadOnlyDictionary verwenden und verteilt es nur einmal:

public static class ComboModel { 
    private static readonly ReadOnlyDictionary<int, int[]> _items = new ReadOnlyDictionary<int, int[]>(new Dictionary<int, int[]> { 
     { 
      1, 
      new[] { 
       2, 
       3, 
       4 
      } 
     } 
    }); 

    public static IReadOnlyDictionary<int, int[]> Items 
    { 
     get { return _items; } 
    } 
} 

Beachten Sie, dass nicht nur bei jedem Aufruf neue Instanz zuweisen, wie andere bereits erwähnt - auch falsches Gefühl für den Anrufer zur Verfügung stellen, die er ändern kann dieses Wörterbuch. In ReadOnlyDictionary gibt es keine Methoden, die es ändern können. Es gibt andere Vorteile, wenn der Anrufer die Struktur kennt, die er erhalten hat, kann nicht geändert werden: zum Beispiel kann er dort die Elemente mit mehreren Threads sicher verarbeiten.

Update: natürlich Sammlungen readonly nicht magisch Objekte in diesen Sammlungen readonly gespeichert - nur die Sammlung selbst. Wenn Sie die Unveränderlichkeit von int [] - Arrays in Ihrem Beispiel sicherstellen wollen, machen Sie sie auch nur lesbar:

+0

Sie können sich irren über die irreführende namens "ReadOnlyDictionary" https://stackoverflow.com/questions/32438988/readonlycollection-are-the-objects-immutable –

+0

Sie meinen also, Sie wollen nicht nur Wörterbuch, sondern alle Wert Arrays nur lesen? – Evk

+0

Ich glaube, der Punkt ist, jemanden zu stoppen, der die Daten in der zugrundeliegenden Klasse ändert und so ein Wörterbuch zurückbringt, das erlaubt, dass die Werte darin geändert werden, bricht das. –