Как удалить массив в c#?

Похоже, что ваш первый алгоритм использует C-подобную нотацию, где он указывает начальное состояние, условие для продолжения и то, как состояние обновляется после каждой итерации.

Второй, похоже, использует циклы, основанные на итерации в указанном диапазоне: «для каждого из значений в этом диапазоне выполните следующее ...». Это довольно распространено в современных языках сценариев, таких как Python или Ruby, и, возможно, ближе к тому, как люди думают об итерации.


Любой алгоритм может быть написан с использованием записи другого.

Алгоритм 1 / стиль 2

z := 0
for x := 1 to n do
  for y:= 1 to n do
    z := z + 1
return(z)       # I’m assuming you actually wanted a return value

Алгоритм 2 / стиль 1

r = 0
for i = 1; i <= n; i++ do
  for j = 1; j <= i; j++ do
    for k = j; k <= i + j; k++ do
      r = r + 1
    end for
  end for
end for
return(r)

Придерживайтесь одного стиля или другого, и вы увидите, что различия в количестве не из-за разных стилей псевдокода. Это разные алгоритмы.

24
задан John Saunders 25 August 2013 в 18:14
поделиться

8 ответов

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

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

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

41
ответ дан RossFabricant 28 November 2019 в 22:26
поделиться

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

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

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

для больше на GC.Collect:

17
ответ дан Community 28 November 2019 в 22:26
поделиться

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

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

, Когда у Вас закончится память, сборщик "мусора" умрет, остановить Ваш код и пересечь все живые объекты в памяти.
живой означает некоторую ссылку на стеке, регистре, статической ссылке и некоторых других вещах, известных коллективно как 'Корни GC'. Поскольку это пересекает их, это отмечает, что они живы.

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

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

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

  1. знают, что Вам нужно к
  2. , знают, как к
  3. знают, как проверить, что Вы сделали это право
5
ответ дан ShuggyCoUk 28 November 2019 в 22:26
поделиться

Необходимо читать статья Chris Brumme о предмете ; первые несколько абзацев должны объяснить ситуацию.

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

, Даже если Вы добавляете “aC = пустой указатель; ” после Вашего использования его, JIT свободен полагать, что это присвоение мертвый код и устраняет его.

5
ответ дан Greg Beech 28 November 2019 в 22:26
поделиться

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

для получения дополнительной информации, см. http://en.wikipedia.org/wiki/Garbage_collection_ (computer_science)

3
ответ дан mandaleeka 28 November 2019 в 22:26
поделиться

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

3
ответ дан Trap 28 November 2019 в 22:26
поделиться

Самое близкое, которое Вы получаете, должно только ожидать его выходящий из объема или устанавливающий его в NULL.

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

1
ответ дан Arjan Einbu 28 November 2019 в 22:26
поделиться

Массив = пустой указатель будет достаточен, никакая потребность в GC.Collect. Можно проверить, что память прежде, чем сослаться для обнуления Вас может он с Консолью. WriteLine (GC.GetTotalMemory), затем проверьте его снова.

2
ответ дан 28 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

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