2016-03-31 3 views
1

Учитывая следующий класс:Каковы недостатки этого шаблона для обеспечения неизменности?

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

Я хочу, чтобы гарантировать неизменность данных в классе, но это чувствует Javascript-у и обращается некоторой смутную (но сильная) критика со стороны моих коллег. Что с этим не так?

+1

Глядя очень странно. –

+10

Ну, он выделяет каждый раз при вызове метода. Возможно, просто используйте ['ImmutableDictionary'] (https://msdn.microsoft.com/en-us/library/dn467181 (v = vs.111) .aspx) вместо этого? – vcsjones

+1

Он также использует много строк в буфере редактора;) – Dai

ответ

4

Просто используйте ReadOnlyDictionary, и передать его только один раз:

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; } 
    } 
} 

Обратите внимание, что вы не только выделить новый экземпляр на каждый вызов, как и другие уже упоминалось - вы также обеспечить неправильное чувство к абоненту, что он может изменить этот словарь. В ReadOnlyDictionary отсутствуют методы, которые могут его модифицировать. Существуют и другие преимущества, когда вызывающий абонент знает, что полученная структура не может быть изменена: например, он может безопасно обрабатывать элементы там с несколькими потоками.

Обновление: естественно, коллекции только для чтения не волшебным образом делают объекты, хранящиеся в этих коллекциях, только для чтения - только сама коллекция. Если вы хотите обеспечить неизменность массивов int [] в вашем примере, просто сделайте их только для чтения:

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

    public static IReadOnlyDictionary<int, ReadOnlyCollection<int>> Items 
    { 
     get { return _items; } 
    } 
} 
+0

Возможно, вы ошибаетесь в отношении ошибочно названного «ReadOnlyDictionary» https://stackoverflow.com/questions/32438988/readonlycollection-are-the-objects-immutable –

+0

Значит, вы хотите сделать не только словарь, но все массивы значений и только для чтения? – Evk

+0

Я считаю, что нужно остановить любого, изменяющего данные в базовом классе, и, таким образом, вернуть словарь, который позволяет изменять значения в нем. –

 Смежные вопросы

  • Нет связанных вопросов^_^