У меня должны быть методы, которые возвращают списки Доступных экземпляров?

У меня есть класс, экземпляры которого должны быть расположены. У меня также есть несколько классов, которые производят эти экземпляры, или отдельно или списки их.

Если я возвращаюсь IList<MyClass> из моих методов или если я создаю класс, который является MyClassCollection который также доступен, и возвратите это вместо этого?

Править:

Моя главная причина для выяснения состоит в том, что я закончил тем, что делал это довольно много:

IList<MyObject> list = GetList();
foreach(MyObject obj in list)
{
     //do something
     obj.Dispose();
} 

и кажется, что я лучше сделал бы:

using (IList<MyObject> list = GetList())
{
     foreach(MyObject obj in list)
     {
     //do something

     } 
}
6
задан Sam Holder 29 January 2010 в 09:42
поделиться

5 ответов

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

public class ListScope : IDisposable
{
    private IList list;
    public ListScope(IList list)
    {
        this.list = list;
    }

    #region IDisposable Members

    public void Dispose ()
    {
        foreach ( object o in this.list )
        {
            IDisposable disposable = ( o as IDisposable );
            if (disposable != null)
                    disposable.Dispose ();
        }
    }

    #endregion
}

Вы могли бы использовать как:

using ( new ListScope ( list ) )
{
   // Do stuff with list
}
1
ответ дан 10 December 2019 в 02:47
поделиться

Вы также можете использовать расширение, если вы хотите:

static class Extensions
{
 public static void DoStuffAndDisposeElements<T> ( this List<T> list, Action<T> action )
 {
        list.ForEach ( x => { action ( x );
               IDisposable disposable = (x as IDisposable);
               if ( disposable != null )
                  disposable.Dispose ();

        } );
 }


}

, который вы могли бы назвать:

getList().DoStuffAndDisposeElements ( x => doStuff(x));

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

1
ответ дан 10 December 2019 в 02:47
поделиться

Может быть легче генерировать последовательность элементов ( IENumerable ), а не список - есть способы, которые вы можете сделать Срок службы каждого привязан к итератору, так что:

  • у вас есть только один за раз (я предполагаю, что они дороги)
  • они подвергаются утилизации, когда их время
  • , они все получают, даже в Ошибка

Это тема, которую я исследовал здесь , используя linq, но есть и другие способы, если ваш источник (или может быть) последовательностью.

3
ответ дан 10 December 2019 в 02:47
поделиться

Я не знаю, будет ли это простым решением, особенно по сравнению с EHCache или подобным, но вы просмотрели библиотеку Javolution ? Он не предназначен как таковой, но в пакете javolution.context они имеют распределитель образца который может повторно использовать объекты без необходимости сбора мусора. Таким образом, они сводят к минимуму создание объектов и сбор мусора, что является важной функцией для программирования в реальном времени. Возможно, вам стоит взглянуть и попытаться приспособить его к своей проблеме.

-121--1501816-

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

Возможно, можно создать универсальный список IDisposureList < T > с ограничением на T , где T: IDisposable , и класс реализует IDisposable , вызвав Dispose на всех его элементах? Затем можно повторно использовать этот класс для всех различных типов IDisposable .

-121--4321094-

Вызов метода Dispose () полностью зависит от кода клиента. Только он знает, когда это делается с помощью объектов. Вы не можете помочь ни в одном пути, потому что не знаете, как будет выглядеть этот код. Создание объектов списка, которые размещают свои элементы, не является хорошей идеей. Рамка не содержит объекта сбора, который делает это. Вы просто запутаете программиста кода клиента.

2
ответ дан 10 December 2019 в 02:47
поделиться

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

Возможно Вы могли бы сделать общий IDisposableList с ограничением по T где T : IDisposable и заставить Ваш класс реализовать IDisposable, вызвав Dispose по всем его элементам? Тогда Вы можете повторно использовать этот класс для всех Ваших различных типов IDisposable.

2
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

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