Как List.Clear() реализован на С#?

Я предполагаю, что он использует массив для реализации List. Как реализовано List.Clear()? Действительно ли он очищает массив или просто создает новый массив для этого списка?

public class List {

    private Array _array;

    public void Clear1 () {
        _array.length = 0;
    }
    public void Clear2 () {
        _array = new Array();
    }
}

Ответы

Ответ 1

Как это (с использованием .NET Reflector):

public void Clear()
{
    if (this._size > 0)
    {
        Array.Clear(this._items, 0, this._size);
        this._size = 0;
    }
    this._version++;
}

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

Ответ 2

MSDN:

Count установлен в 0, а ссылки на другие объекты из элементов коллекция также выпущена.

Емкость остается неизменной. Для resetпропускную способность списка, TrimExcess или установите Емкость собственности напрямую. Уменьшение емкость перераспределяет память и копии все элементы в Списке. Обрезка пустого списка устанавливает пропускная способность списка по умолчанию емкость.

Этот метод является операцией O (n) где n - граф.

Ответ 3

Начиная с .NET 4.0, он выполняет следующие действия:

  • Заблокирует массив поддержки с вызовом Array.Clear. Это фактически делает операцию O (n).
  • Устанавливает размер до 0.
  • Увеличивает внутренний номер версии, так что активные счетчики будут бросать InvalidOperationExceptions, если на них вызывается MoveNext.