Как представить свойство набора? [закрытый]

Произошла эта же ошибка, хотя я только обновлял одну таблицу с одной записью, но после перезапуска mysql она была разрешена.

48
задан jedatu 16 September 2008 в 15:05
поделиться

5 ответов

То, как Вы представляете набор, зависит полностью от того, как пользователи предназначаются для взаимодействия с ним.

1) , Если пользователи будут добавлять и удалять объекты из набора объекта, то простое свойство набора только добирания является лучшим (опция № 1 от исходного вопроса):

private readonly Collection<T> myCollection_ = new ...;
public Collection<T> MyCollection {
  get { return this.myCollection_; }
}

Эта стратегия используется для эти Items наборы на WindowsForms и средствах управления WPF ItemsControl, где пользователи добавляют и удаляют объекты, они хотят, чтобы управление отобразилось. Эти средства управления публикуют фактический набор и используют обратные вызовы или слушателей события для отслеживания объекты.

WPF также представляет некоторые устанавливаемые наборы, чтобы позволить пользователям отображать набор объектов, которыми они управляют, такой как ItemsSource свойство на ItemsControl (опция № 3 от исходного вопроса). Однако это не случай общего использования.


2) , Если пользователи будут только считывать данные, сохраняемые объектом, то можно использовать набор только для чтения, как [1 112] Увертливый предложенный:

private readonly List<T> myPrivateCollection_ = new ...;
private ReadOnlyCollection<T> myPrivateCollectionView_;
public ReadOnlyCollection<T> MyCollection {
  get {
    if( this.myPrivateCollectionView_ == null ) { /* lazily initialize view */ }
    return this.myPrivateCollectionView_;
  }
}

Примечание, которое ReadOnlyCollection<T> обеспечивает предпросмотр в реальном времени базового набора, таким образом, только необходимо создать представление однажды.

, Если внутренний набор не реализует IList<T>, или если Вы хотите ограничить доступ к большему количеству опытных пользователей, можно вместо этого обернуть доступ к набору через перечислитель:

public IEnumerable<T> MyCollection {
  get {
    foreach( T item in this.myPrivateCollection_ )
      yield return item;
  }
}

Этот подход прост реализовать и также предоставляет доступ всем участникам, не представляя внутренний набор. Однако это действительно требует, чтобы набор остался unmodfied, поскольку классы набора BCL выдадут исключение, при попытке перечислить набор после того, как это было изменено. Если базовый набор, вероятно, изменится, можно или создать легкую обертку, которая перечислит набор безопасно или возвратит копию набора.


3) Наконец, если необходимо представить массивы, а не высокоуровневые наборы, тогда необходимо возвратить копию массива, чтобы препятствовать тому, чтобы пользователи изменили его (опция № 2 от orginal вопроса):

private T[] myArray_;
public T[] GetMyArray( ) {
  T[] copy = new T[this.myArray_.Length];
  this.myArray_.CopyTo( copy, 0 );
  return copy;
  // Note: if you are using LINQ, calling the 'ToArray( )' 
  //  extension method will create a copy for you.
}

Вы не должны представлять основной массив через свойство, поскольку Вы не будете в состоянии сказать, когда пользователи изменят его. Чтобы позволить изменять массив, можно или добавить соответствие SetMyArray( T[] array ) метод или использовать пользовательский индексатор:

public T this[int index] {
  get { return this.myArray_[index]; }
  set {
    // TODO: validate new value; raise change event; etc.
    this.myArray_[index] = value;
  }
}

(конечно, путем реализации пользовательского индексатора, Вы будете копировать работу классов BCL:)

55
ответ дан Community 7 November 2019 в 22:41
поделиться

Я обычно иду для этого, общедоступный метод get, который возвращает Систему. Наборы. ObjectModel. ReadOnlyCollection:

public ReadOnlyCollection<SomeClass> Collection
{
    get
    {
         return new ReadOnlyCollection<SomeClass>(myList);
    }
}

И открытые методы для объекта изменить набор.

Clear();
Add(SomeClass class);

, Если класс, как предполагается, является репозиторием для других людей для питания с тогда, я просто представляю частную переменную согласно методу № 1, поскольку это сохраняет запись собственного API, но я склонен уклоняться от этого в производственном коде.

3
ответ дан Quibblesome 7 November 2019 в 22:41
поделиться

Я - Java-разработчик, но я думаю, что это - то же для c#.

я никогда не представляю свойства частной коллекции, потому что другие части программы могут изменить его без родителя, замечающего, так, чтобы в методе получателя я возвратил массив с объектами набора, и в методе установщика я звоню clearAll() по набору и затем addAll()

0
ответ дан Patrick D'Souza 7 November 2019 в 22:41
поделиться

Если Вы просто надеетесь представлять набор на своем экземпляре, то использование метода get/метода set к переменной члена парламента, не занимающего официального поста походит на наиболее разумное решение меня (Ваша первая предложенная опция).

0
ответ дан Ryan Duffield 7 November 2019 в 22:41
поделиться

Почему вы предлагаете использование ReadOnlyCollection (T) - это компромисс? Если вам все еще нужно получать уведомления об изменениях, сделанные в исходном обернутом IList, вы также можете использовать ReadOnlyObservableCollection (T) , чтобы обернуть вашу коллекцию. Будет ли это меньшим компромиссом в вашем сценарии?

0
ответ дан 26 November 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: