Удаляется ли эта переменная после использования?

Я просто не знаю, куда исчезла переменная, используемая в каком-то методе, после завершения выполнения метода, см. фрагмент кода ниже:

    void Foo()
    {
        List<object> conditionedObjList;
        conditionedObjList = GetConditionedObjectList
            (
            new List<object>() { /*there are many unconditioned objects here*/}
            );
    }

Мой вопрос; переменная myObjList, определенная в методе GetConditionedObjectList, будет удалена после того, как myObjList вернется, или нам нужно удалить ее вручную?

    private List<object> GetConditionedObjectList(List<object> originalObjList)
    {
        List<object> myObjList = new List<object>();
        /*do some selection*/
        myObjList.AddRange(new object[]{/*there are 100 conditioned objects here*/});
        return myObjList;
    }

person Restart    schedule 22.03.2011    source источник
comment
Непонятно, что вы пытаетесь сделать. GetConditionedObjectList полностью игнорирует входящий параметр. (Возможно, это не имеет значения, но затемняет ваш вопрос.) Когда вызов GetConditionedObjectList возвращается, локальная переменная (в Foo) conditionedObjList будет ссылкой на список myObjList, который вы создали в GetConditionedObjectList. Когда Foo выйдет, ссылки на список больше не будет, и он будет помечен для сборки мусора.   -  person Joel Lee    schedule 22.03.2011
comment
Похоже, вы говорите о сборке мусора, а не об утилизации (что имеет другое значение в .NET).   -  person Brian Rasmussen    schedule 22.03.2011
comment
Для Джоэла: представьте, что T является строкой, в методе 'GetConditionedObjectList' я делаю некоторый выбор из входящего параметра originalObjList, например перечислите список, чтобы проверить, является ли элемент в originalObjList строкой, начинающейся с foo, затем добавьте элемент в myObjList. и вернуть myObjList.   -  person Restart    schedule 22.03.2011


Ответы (3)


C# имеет сборку мусора. Объекты создаются в куче и собираются только тогда, когда у объекта больше нет ссылок на него.

myObjList просто сохраняет ссылку на фактический объект, который находится в куче; когда вы возвращаете эту ссылку и сохраняете ее в переменной, вы гарантируете, что сборщик мусора (GC) не подберет ее.

Если под «удалено» вы подразумеваете «уничтожено» или «удалено из памяти», то сборщик мусора сделает это за вас; все, что вам нужно сделать, это удалить ссылки на объект. Например, вы можете установить conditionedObjList в null после вызова функции. Тогда сборщик мусора сможет подобрать объект, на который нет ссылки. Обратите внимание, что это не немедленно; сборщик мусора запускается только периодически, чтобы быть более эффективным.

person Cameron    schedule 22.03.2011
comment
Простое сохранение ссылки в переменной стека не гарантирует, что она не будет собрана: codeneverwriting.com/2007/12/04/where-did-my-object-go-part-1 - person Curt Nichols; 31.03.2011
comment
@Curt: Хм, интересно. Я попробовал пример в статье, но не смог воспроизвести поведение в .NET 3.5 (и отладка, и выпуск ведут себя одинаково, не собирая объект до тех пор, пока метод не завершится, хотя до завершения Main). Также маловероятно, что вы случайно столкнетесь с таким поведением... - person Cameron; 31.03.2011

Он не удаляется, так как вы возвращаете ссылку на него.

Он вышел бы за рамки, если бы он использовался в функции только локально, в этом случае после возврата функции на него нет ссылок, поэтому GC может его собрать.

Кстати, List<T> не реализует IDisposable, поэтому его не нужно размещать в вашем коде.

person Sanjeevakumar Hiremath    schedule 22.03.2011

  1. Список не реализует IDisposable, поэтому нам вообще не нужно его удалять.
  2. Он будет помечен как сборщик мусора, как только у вас не будет ссылки на него.
person zerkms    schedule 22.03.2011