Эта переменная утилизируется после использования? - PullRequest
2 голосов
/ 22 марта 2011

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

    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;
    }

Ответы [ 3 ]

1 голос
/ 22 марта 2011

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

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

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

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

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

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

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

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