2010-01-08 4 views
1

У меня есть библиотека, которая возвращает иерархический список, состоящий из IDictionary, IList и примитивных типов (string и ints). В настоящее время я не могу изменить способ возврата этих данных.C# Вопрос сборщика мусора

У меня есть еще один строго типизированный класс, который использует эти данные и преобразует их в бизнес-объекты. В возвращаемых данных есть список «свойств», которые я хочу импортировать в свой строго типизированный класс. Затем я могу распоряжаться иерархией.

Мой вопрос заключается в следующем: если я это сделать:

MyCustomClass.Properties = HierarchicalData["some_name"] 

Где MyCustomClass моя сильно типизированных классов и HierarchicalData это данные IDictionary, что происходит, когда я позже по телефону:

HierarchicalData = null 

Может Иерархические данные должны быть удалены и выпущены? «some_data» в этом случае - это другой Словарь, и поэтому технически это все, что нужно сохранить. Мне нужно сделать явную копию вместо того, чтобы импортировать ли, такие как:

MyCustomClass.Properties = HierarchicalData["some_name"].ToDictionary<string, string>(/* selector */) 

Разъяснение: Я не беспокоится о словаре, содержащим свойство сборщика мусора. Я хочу, чтобы HierarchicalData __can__ был удален, поскольку он довольно большой, и мне нужно работать с несколькими из них.

+1

'Словарь' не реализует' IDisposable', поэтому он не должен быть (и не может быть) удален. Вы просто хотите, чтобы он был собран GC. – SLaks

+0

Да, здесь, когда я говорю, что я имею в виду, я имею в виду вне сферы действия и, следовательно, кандидат на сбор, а не как в Dispose(). – GrayWizardx

ответ

2

Да. Когда нет ссылок на HierarchicalData, он будет кандидатом на сбор.

Поскольку у вас есть ссылка на данные, хранящиеся для ключа «some_name», этот конкретный элемент (другой словарь) не будет собран.Тем не менее, другие, неопубликованные, части будут распущены в отношении GC, и в какой-то момент они будут завершены.

+0

Удивительный, вот что я думал, но хотел убедиться. – GrayWizardx

1

Это будет работать так, как вы ожидаете. Поскольку вы создадите ссылку на словарь, на который ссылается HierarchicalData["some_name"], в другом месте сборщик мусора будет хранить его для вас.

Вам определенно не нужно копировать словарь.

1

Предполагая, что класс возвращает стандарт Dictionary<TKey, TValue>, вам, вероятно, не нужно ничего делать.

Объекты, вероятно, не содержат ссылок на словарь, который их содержит, поэтому они, вероятно, не будут препятствовать сбору словаря.
Однако, нет никакого способа убедиться, не проверив; вы должны проверить объекты в окне просмотра отладчика Visual Studio (или посмотреть на источник) и посмотреть, ссылаются ли они на словарь.

+0

Да, я просто хотел реализовать наиболее вероятный путь, прежде чем я поместил это в тестовую установку и провел тесты профиля в течение ночи. – GrayWizardx

0

Вам не нужно делать копию.

Линия:

MyCustomClass.Properties = HierarchicalData["some_name"] 

присваивает ссылку, и в то время как ссылка на объект жив, он не будет мусора.

0

Могут ли быть удалены и выпущены иерархические данные?

Вы имеете в виду GC? Не в этом случае, поскольку на него ссылаются ваши объекты. GC не собирается испортить это.

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