c # очистка списка против назначения нового списка существующей переменной

2

Я учу С#.

Если я сначала сделаю переменную для хранения списка.

List<int> mylist = new List<int>();

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

Способ 1:

mylist.Clear();

Способ 2:

mylist = new List<int>();

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

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


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

  • 1
    Если вы делаете List<int> mylist = new List<int>(); , а затем вы создаете новый список готов к использованию. Нет необходимости очищать его, он готов к использованию, просто получите доступ к нему через вашу переменную ( mylist ), которая содержит ссылку на нее. Если вы переназначаете список ( mylist = new List<int>(); ), тогда ваш код больше не ссылается на старый список (если других ссылок на этот список нет, то он готов к сборке мусора ), и вы создаете новый список. Ваша переменная mylist теперь содержит ссылку на этот новый список, и она готова к использованию таким же образом.
  • 0
    Очистка поможет с ненужным распределением и ненужным сбором GC, но оставит больше выделенной памяти ... так что вопрос в основном основан на опциях: скорость против использования памяти
Показать ещё 1 комментарий
Теги:
list

3 ответа

2

Метод 2 вызовет перераспределение, в то время как метод 1 просто очищает внутренний массив, чтобы сборщик мусора мог освободить память:

Из источника:

// Clears the contents of List.
public void Clear() {
    if (_size > 0)
    {
        Array.Clear(_items, 0, _size); // Don't need to doc this but we clear the elements so that the gc can reclaim the references.
        _size = 0;
    }
    _version++;
}

https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,2765070d40f47b98

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

  • 1
    в то время как метод 1 раз очищает внутренний массив поэтому сборщик мусора может освободить память , не правда первый метод не вызовет каких - либо GC работы редактирования: ... для списка itsef - если , конечно , список будет хранить какой - либо другой объект , чем примитивов было бы - но опять же для List<int> будет не GC работа
  • 0
    а про Array.Clear это очень простой RtlSecureZeroMemory(*_items, size*sizeof(T)) на платформе Windows (для примитивов) ... когда "reallocation" это alloc + создать новый экземпляр List, alloc + создать все поля List class ... и alloc в .net - это не простой вызов RtlAllocateHeap ... вы должны создать указатель для GC и т. д. и т. д. (снова для List <int>)
1

Использование метода 2 может привести к неожиданному поведению в вашей программе в зависимости от того, как вы используете список.

Если бы вы сделали что-то вроде:

List<int> myList = new List<int> { 1, 2, 3 };

someObj.listData = myList;

myList = new List<int>(); // clearing the list.

данные в "someObj" по-прежнему будут 1,2,3.

Однако, если вы вместо этого сделали myList.clear(), данные в "someObj" также будут очищены.

Дополнительная мысль, которую я только что имел. Если у вас есть свисающие ссылки на исходный список, и переназначьте переменную, используя new, чтобы очистить ее, GC никогда не очистит эту память. Я бы сказал, что всегда безопаснее использовать метод .clear(), если вам нужно очистить содержимое списка.

1

Есть ли побочный эффект при использовании method2? Да. Во-первых, есть выделение нового объекта. Во-вторых, первый список может быть получен при следующем сборке мусора.

Стоит ли отдавать предпочтение одному методу другому? Вы должны отдать предпочтение первому способу, поскольку он выражает ваше намерение очистить список более четко.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню