Когда более уместно назначить новый список, чем .Clear () существующему списку? - PullRequest
2 голосов
/ 22 августа 2011

Имеется список:

List<myType> myList = new List<myType>();

с изменением содержимого коллекции во время выполнения ....

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

myList = new List<myType>();

, а не

myList.Clear();

Я могу вспомнить ряд причин, по которым я предпочел бы одну над другой, но есть ли другие хорошие критерии или рекомендации относительно того, когда один метод предпочтительнее другого

Ответы [ 2 ]

3 голосов
/ 22 августа 2011

Если список большой (80 килобайт или более), он будет сохранен в куче больших объектов .Официальное руководство для LOH состоит в том, чтобы максимально использовать объекты там, чтобы уменьшить фрагментацию кучи.LOH не сжимается, как обычная куча.

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

Если вы вызываете Clear, он просто устанавливает все элементы вlist к их значениям по умолчанию и устанавливает Count в 0. Это не меняет емкость списка.Таким образом, вызов Clear не изменит объем памяти, выделенной для коллекции.Если вы хотите очистить список и уменьшить его размер, позвоните по номеру Clear, а затем TrimExcess.

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

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

2 голосов
/ 22 августа 2011

Если вы привязываетесь к объекту списка и имеете ссылки на него из других областей кода - используйте метод clear. Если у вас нет ссылок и вы не связаны, тогда создание нового объекта будет уместным.

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