Как 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
.