Как удалить массив в C #? - PullRequest
24 голосов
/ 25 февраля 2009

Извините, если это очевидный вопрос, но ни Google, ни поиск здесь не привели меня к ответу.

Есть ли способ полностью удалить массив?

Я хочу напротив из int[] array = new int[5]

Ответы [ 10 ]

39 голосов
/ 25 февраля 2009

Скажем, вы звоните:

 void Foo(){
     int[] a = new int[5];
 }

В C # нет способа отменить определение переменной a. Это означает, что a будет определено в Foo, даже если для a установлено значение NULL. Однако в конце Foo a выйдет за рамки. Это означает, что ни один код не может ссылаться на него, и сборщик мусора позаботится о том, чтобы освободить память для вас при следующем запуске, что может быть не надолго

17 голосов
/ 25 февраля 2009

Вы просто должны выпустить его из области видимости и ждать, пока GC его найдет; что может быть не сразу (на самом деле, это почти наверняка не будет). Если у вас есть поле на долгоживущем объекте (который будет оставаться в области видимости), то вы можете установить значение null, что может помочь.

Вы можете повлиять на сбор мусора раньше (не только на ваш объект: все подходящее), но вам редко следует , если вообще делать это. Я использую его только на испытательных стендах; но:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); // DON'T DO THIS!!!

Подробнее о GC.Collect:

5 голосов
/ 25 февраля 2009

Вам следует прочитать статью Криса Брамма на эту тему ; первые несколько параграфов должны объяснить ситуацию.

И всем, кто предлагает «присвоить переменной значение null», следует обратить особое внимание на часть, которая гласит:

Даже если вы добавите «aC = null;» после того, как вы его используете, JIT может считать это назначение мертвым кодом и исключить его.

5 голосов
/ 25 февраля 2009

Нет необходимости удалять массив, GC с ним справится.

(Очень) Упрощенно:

Когда вам не хватает памяти, включается сборщик мусора, останавливайте ваш код и просматривайте все живые объекты в памяти.
live означает некоторую ссылку на стек, регистр, статическую ссылку и некоторые другие вещи, известные под общим названием «GC Roots». Проходя через них, он отмечает, что они живы.

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

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

Чтобы было ясно, как новичку, вы не должны думать об этом, пусть GC выполняет свою работу и старается помочь ему только тогда, когда вы:

  1. знаю, что вам нужно
  2. умеет
  3. знаю, как проверить, правильно ли вы сделали
3 голосов
/ 25 февраля 2009

Просто чтобы уточнить, если вы не понимаете некоторые термины, выраженные в других ответах, GC означает сборщик мусора. Такие языки, как C #, которые имеют автоматическое управление памятью, позволяют вам сосредоточиться на том, что нужно сделать, и не беспокоиться о том, что вы создаете, и когда его удалять. GC периодически просматривает все созданные вами объекты и проверяет, есть ли на них ссылки. Если нет, то это означает, что вы никак не можете с ними что-либо сделать, поэтому они также могут быть удалены, и система так и сделает.

Подробнее см. http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

3 голосов
/ 25 февраля 2009

array = null, но я думаю, что будет хорошей идеей, если вы немного прочитаете о модели управления памятью .NET, чтобы полностью понять, почему.

1 голос
/ 25 февраля 2009

Самое близкое, что вы получите, - это просто подождать, пока оно выйдет из области видимости, или установить его на ноль.

Он не удалит или не удалит массив сразу, но после удаления всех ссылок на массив сборщик мусора (GC) удалит его вовремя ...

0 голосов
/ 09 марта 2014

В C ++ можно использовать ключевое слово delete . И это было первоначально упомянуто в этом комментарии и в других комментариях. История редактирования показывает это. Это жизнеспособно (хотя и побочный ответ), даже если другие не понимают, почему. Я говорю это потому, что его можно использовать, чтобы найти собственное элегантное решение, если они понимают более одного языка.

В .NET / MSIL у вас есть ключевое слово delete, но оно называется variablename .Dispose (). Я предлагаю это, потому что он удаляет все ссылки на переменную и переводит ее в состояние готовности к сборке мусора. Другой вариант - установить переменную равной null , так как она сохранит переменную как типизированный объект, но освободит то, что она содержала для сборки мусора, чтобы ее можно было переназначить позже.

Оригинальный комментарий / ответ:

Сборка мусора для C # отличная и все, но иногда вам действительно нужно удалить переменную из памяти и создать ее новый экземпляр, без какой-либо другой части вашей программы, поддерживающей ее работу. Можно потенциально перевести существующий кусок памяти, удерживаемый массивом, в состояние GC, указав массив на новый фрагмент памяти, такой как:

aMyArray = new int[];

Однако главная проблема, которую я могу видеть таким образом, заключается в том, что вы действительно не хотите тратить кучу памяти, а затем все останавливается, когда GC запускается из-за того, что ОС волнуется. Я придерживаюсь этой мысли, учитывая, что C Sharp теперь является основным языком и используется в МНОЖЕСТВЕ различных приложений, включая написание игр ... Было бы действительно хорошо, если бы C Sharp не действовал подобно ActionScript / FLASH в этом уважение.

0 голосов
/ 07 сентября 2013

Вы можете объявить и инициализировать ваш массив в операторе if (true) {}, из оператора if (после него) переменная массива недоступна, поэтому она будет удалена.

0 голосов
/ 09 ноября 2012

Возможно, это решено, но вы можете рассматривать массив как стек. Проходите по кругу и извлекайте из каждой итерации верх.

while(true)
{
    if(array.Length==0)
    {
        break;
    }
    array.Pop();
}

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

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