C # сборщик мусора вопрос - PullRequest
1 голос
/ 08 января 2010

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

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

У меня такой вопрос: если я сделаю это:

MyCustomClass.Properties = HierarchicalData["some_name"]

Где MyCustomClass - мой строго типизированный класс, а HierarchicalData - данные IDictionary, что происходит, когда я позже вызываю:

HierarchicalData = null

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

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

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

Ответы [ 5 ]

2 голосов
/ 08 января 2010

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

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

1 голос
/ 08 января 2010

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

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

1 голос
/ 08 января 2010

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

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

0 голосов
/ 08 января 2010

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

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

0 голосов
/ 08 января 2010

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

Линия:

MyCustomClass.Properties = HierarchicalData["some_name"] 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...