Прежде всего: это правильно?
Да. Оригинал исчезает, как только заканчивается область действия.
Во-вторых, где хранится эта копия wint? Он не может быть в стеке, с тех пор он исчезнет после завершения функции (верно?). Означает ли это, что копия хранится в куче вместе с weightedInts? И собирается ли мусор после удаления, как если бы это был экземпляр ссылочного типа?
Ваш экземпляр List<WeightedInt>
создает массив в куче. Вы назначаете части этого массива копию вашего типа значения, когда вы «добавляете» его в список. Значение сохраняется в куче как часть массива (внутренняя часть класса List).
Когда ваш член weightedInts выходит из области видимости, он становится необжитым и будет иметь право на сбор мусора. В какой-то момент после этого GC запустится и освободит память, связанную с его внутренним массивом, освободив тем самым память, связанную с вашей копией wint.
Edit:
Также при звонке:
weightedInts.Remove(wint);
Происходит несколько вещей (с List<T>
).
Во-первых, список находит индекс FIRST-экземпляра вашего типа значения, равный wint. Затем он вызывает RemoteAt (индекс).
Метод RemoveAt (index) в основном отмечает, что внутренний размер на один меньше, а затем проверяет индекс, который вы удаляете. Если он находится в середине списка, он фактически копирует ВСЕ экземпляры типа значения в один элемент, используя Array.Copy, чтобы «сжать» список. Затем он обнуляет память в конце массива.
Сам массив не сжимается, поэтому при удалении элементов не освобождается память. Если вы хотите восстановить эту память (или даже сделать ее доступной для GC), вам нужно позвонить List<T>
. TrimExcess ().