Надлежащая реализация IDisposable с Silverlight? - PullRequest
2 голосов
/ 28 января 2009

Я работаю над приложением Silverlight, используя шаблон MVVM. Моя ViewModel в настоящее время состоит из свойства, которое представляет коллекцию объектов модели:

public ObservableCollection<IndexEntry> IndexList
        {
            get;
            set;
        }

он также имеет несколько методов, которые заполняют эту коллекцию данными, возвращаемыми из веб-службы.

Поскольку экземпляры этого класса могут создаваться и уничтожаться в ходе выполнения приложения, я должен реализовать IDisposable и установить для ссылки на свойство значение null, или уничтожения этого класса будет достаточно для удаления всех ссылок на коллекцию Это свойство относится к? Есть ли какие-либо предостережения, которые могли бы оставить ссылку там?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 28 января 2009

Единственный способ выживания ссылки на сборку мусора - это если он укоренен. Если есть еще какой-то другой класс, который все еще используется, который содержит ссылку на ObservableCollection, то ObservableCollection не будет уничтожен, независимо от того, установлено или нет значение null. Например, предположим, что есть один объект «в памяти», который является вашей коллекцией. У вас есть одна ссылка на это, в вашей собственности. Другой код выполняет строку «ObservableCollection <> myOtherReference = YourObject.IndexList;». Теперь у них также есть ссылка на реальный объект памяти. Если сделать ссылку на вашу собственность нулевой, это только исключит ссылку на вашу собственность; ссылка 'myOtherReference' остается неизменной, поскольку теперь она указывает непосредственно на память, а не на вашу собственность. Если вы действительно хотите удалить этот элемент из памяти, вам нужно удалить ВСЕ ссылки или реализовать некоторую решающую логику «утилизации», после чего «myOtherReference» будет указателем на удаленный объект, и любой вызов этого объекта вызовет исключение.

3 голосов
/ 28 января 2009

GWLlosa находится на месте. Кроме того, привязка данных Silverlight будет удерживать вашу ViewModel, пока у вас есть ссылка Binding на нее. Другими словами, вам нужно либо удалить вашу ViewModel из DataContext представления (установив View.DataContext = null), либо ваше представление необходимо будет удалить из визуального дерева перед выпуском вашей ViewModel. Внедрение IDisposable не поможет, и я бы не рекомендовал его для этого. IDisposable предназначен для очистки неуправляемых ресурсов или для большего контроля над удалением управляемых ресурсов. В этом случае нет необходимости, если вы правильно понимаете, как работают привязки и ссылки, и просто позволяете сборщику мусора позаботиться обо всем. Эта статья может помочь:

Поиск утечек памяти в приложениях WPF

В основном это WPF, но вы можете использовать приемы и в Silverlight.

Здорово видеть, что вы используете ViewModel, кстати. Я большой поклонник этой модели.

...