Я могу вызвать очистку памяти в C#?

стандартный класс является аккуратным контейнером. Я только недавно узнал об этом.

Вместо того, чтобы использовать массив для содержания атрибутов serveral

$person = array();
$person['name'] = 'bob';
$person['age'] = 5;

можно использовать стандартный класс

$person = new stdClass();
$person->name = 'bob';
$person->age = 5;

, Это особенно полезно при доступе к этим переменным в строке

$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";
6
задан Jason D 5 December 2009 в 18:14
поделиться

4 ответа

Джим,

Вы правильно расслышали. Он периодически очищает память с помощью механизма, называемого сборщиком мусора. Вы можете «принудительно» выполнить сборку мусора с помощью вызова, подобного приведенному ниже.

GC.Collect();

Я настоятельно рекомендую вам прочитать эту статью MSDN о сборке мусора .

РЕДАКТИРОВАТЬ 1: «Force» было в кавычках. Чтобы быть более ясным, как был другой плакат, это действительно только предполагает это. Вы не можете добиться того, чтобы это произошло в определенный момент времени. Отсюда ссылка на статью о сборке мусора в .Net

РЕДАКТИРОВАТЬ 2: Я понял, что все здесь только дали прямой ответ на ваш основной вопрос. Что касается вашего второстепенного вопроса. При использовании Visual Studio 2008 Express по-прежнему будет использоваться инфраструктура .net, которая выполняет сборку мусора. Так что если вы когда-нибудь перейдете на профессиональную версию, вы все еще будут иметь те же возможности / ограничения управления памятью.

Редактировать 3: Эта википедия, посвященная финализаторам , дает несколько хороших указателей на то, что уместно делать в финализаторе. Обычно, если вы создаете объект, имеющий доступ к критическим ресурсам, или если вы потребляете такой объект, реализуйте IDispose и / или воспользуйтесь оператором using . Использование автоматически вызовет метод Dispose, даже если возникнут исключения. Это не значит, что вам не нужно давать подсказку финализаторам выполнения ...

повторно создайте объект, имеющий доступ к критическим ресурсам, или, если вы используете такой объект, реализуйте IDispose и / или воспользуйтесь оператором using . Использование автоматически вызовет метод Dispose, даже если возникнут исключения. Это не значит, что вам не нужно давать подсказку финализаторам запуска ...

повторно создайте объект, имеющий доступ к критическим ресурсам, или, если вы используете такой объект, реализуйте IDispose и / или воспользуйтесь оператором using . Использование автоматически вызовет метод Dispose, даже если возникнут исключения. Это не значит, что вам не нужно давать подсказку финализаторам запуска ...

19
ответ дан 8 December 2019 в 02:46
поделиться

Вы не можете заставить C # освободить память, но можете запросить , чтобы CLR освободила объекты, на которые нет ссылок, вызвав

System.GC.Collect();

метод WaitForPendingFinalizers , который «приостанавливает текущий поток до тех пор, пока поток, обрабатывающий очередь финализаторов, не очистит эту очередь». Хотя вам не нужно его называть.

Как предложили другие, за дополнительной информацией обращайтесь к MSDN .

9
ответ дан 8 December 2019 в 02:46
поделиться

Возможно, вы захотите посмотреть этот скринкаст ^ с сайта InfoQ.com . Он представляет собой внутреннее устройство сборщика мусора .NET .

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

Вы можете заставить сборщик мусора собирать объект, на который нет ссылки, с помощью метода

GC.Collect()

. Документация здесь .

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

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