c # очистка списка против присвоения нового списка существующей переменной - PullRequest
0 голосов
/ 10 января 2019

Я изучаю C #.

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

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

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

Метод 1:

mylist.Clear();

Метод 2:

mylist = new List<int>();

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

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


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

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Метод 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

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

0 голосов
/ 10 января 2019

Использование метода 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 (), если вам нужно очистить содержимое списка.

0 голосов
/ 10 января 2019

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

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

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