Удалить массив си шарп

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

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

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

Я хочу противоположность int[] array = new int[5]

11 ответов

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

@ShuggyCoUk Ну, я на самом деле учусь в университете и заполняю (неудачные) пробелы, которые мой профессор оставляет нам с тем, что не освещается в литературе с вопросами. Думаю, искусство задавать вопросы важнее, чем ответы, поэтому я продолжаю задавать вопросы, когда не могу найти ответ.

@bigge И как именно вопрос 2009 года с большим количеством голосов и ответов дублирует вопрос, опубликованный в июле этого года?

Читайте также:  Как изменить css свойства через js

12 ответов

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

Должен любить определенные ответы 🙂 Спасибо большое за то, что спас меня от поиска в Google намного дольше.

Я знаю, что это старая тема, но я надеюсь, что кто-то может помочь. Я наблюдал GC в управляемом, код Net действительно не работает, пока приложение не закрыто. Когда выделение и удаление памяти для массивов или объектов происходит очень часто и многократно, память не освобождается даже при наличии надлежащих блоков () <>. Я заметил, что он продолжает накапливаться в диспетчере задач, пока я сижу на краю стула, размышляя, как им управлять, прежде чем он падает. Есть ли здесь какие-либо недокументированные секреты?

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Php регулярное выражение img src

Возможно, вы заслуживаете отрицательного голосования, потому что это неправильно. Прочитайте часть о назначении ссылки на пустой код, который JIT может удалить, здесь: blogs.msdn.com/cbrumme/archive/2003/04/19/51365.aspx

(Кстати, я не проголосовал, потому что предложение почитать больше о модели памяти .net является хорошим)

Что ж, вы правы, я должен был прояснить, что я ссылался больше на утверждение «Я хочу противоположность int [] array = new int [5]» вместо реального вопроса.

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

Удалить? Установите его в значение null:

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

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

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

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

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

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

Источник

Можно ли удалять массивы в C#?

Например, я хочу удалить из матрицы какую нибудь строку, и я её удалил, но ведь размер матрицы не изменится, ибо я всего навсего скопировал эл-ты другой строки на место этой и уменьшил переменную , которая отвечает за строки на 1 (или просто не показал последнюю строку, если надо её удалить). В с++ я мог (если я работал с динамическими массивами) создать другой массив, у которого кол-во строк на 1-у меньше, скопировать в неё эл-ты из старого массива и удалить старый. В питоне тоже самое, благо в питоне есть ключ. слово del , чтобы удалять переменные и массивы. Но как это сделать в с#, ведь чем больше ты создаёшь массивов и матриц или выделяешь память для них, тем менее оптимизированным становится код. Если знаете напишите пожалуйста.

Читайте также:  Css background shortcut size

Textbox в который можно писать и не можно удалять
Доброго времени суток. Есть текстбокс в который выводится периодически инфа. Подскажите как.

Что из папки можно удалять?
C:\Windows = 16,8Гб папка, чего там почистить можно?

Можно удалять строки от и до (выборочно?)
Здравствуйте. Мне нужно удалить строки, где ID от 100 до 1000 Как это можно сделать?

Эксперт .NETАвтор FAQ

ЦитатаСообщение от Ivan _pupkin Посмотреть сообщение

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

Вы то же самое можете сделать и в C#.
Например через метод Array.Resize (правда это только для одномерных массивов, если у вас матрицы, то их нужно будет представлять как jagged массив)
Но такой хардкор обычно не используется в C#.
Если у вас число элементов массива может меняться, то нужно использовать List<> вместо массивов.

ЦитатаСообщение от Ivan _pupkin Посмотреть сообщение

Но как это сделать в с#, ведь чем больше ты создаёшь массивов и матриц или выделяешь память для них, тем менее оптимизированным становится код.

Пока вы не разобрались в тонкостях языка — лучше не заморачиваться производительностью. И тем более не нужно сюда тащить подходы из C++. Это будет сильно мешать.

Storm23, напишите пожалуйста как можно создать 2-й список, а то я в инете искал, но так и не понял как это сделать. В видео уроке, по которым я учу язык с#(Дударя) не говорится как создать 2-й список, а только массив.

Для начала в массиве просто удалить значение нельзя. Но если очень надо именно с массивами могу предложить следующий вариант

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { int[] mass = new int[] { 1, 2, 3, 4, 5 };//берём массив int del = 3;//что удалить из массива int[] newmass = new int[] { };//новый массив без размера int r = 0;//шаг в массиве Array.Resize(ref newmass, (mass.Length - 1));//создаём размер нового массива на длину меньше перебираемого //перебираем сам массив и записываем нужные значения в новый foreach (int i in mass) { if (i != del) { newmass[r] = i; r++; } } //выводим полученный результат foreach (int i in newmass) Console.WriteLine(i); } } }
Listint> perechis = new Listint> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Console.WriteLine(perechis.Count);//длина перечисления до удаления perechis.Remove(7);//удаляем значение. Внимание удаляет первое вхождение. //выводим полученный результат foreach (int i in perechis) Console.WriteLine(i); Console.WriteLine(perechis.Count);//длина перечисления после удаления
Listint> perechis = new Listint> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7 };

если нужно удалить по индексу то RemovAll(int T) удалить все вхождения значения,
а RemoveAt(int index) удалит значение по индексу.

Источник

Оцените статью