Если я вызову «Method ()», что произойдет с объектом MyClass, который был создан в процессе?
Создается в куче GC. Затем ссылка на его местоположение в куче помещается в стек. Затем происходит звонок в AnotherMethod. Затем вызывается метод ToString объекта и выводится результат. Затем AnotherMethod возвращается.
По-прежнему ли он существует в стеке после вызова, даже если его ничто не использует?
Ваш вопрос неоднозначен. Под «вызовом» вы подразумеваете вызов метода или AnotherMethod? Это имеет значение, потому что на данный момент, является ли куча памяти кандидатом на сборку мусора, зависит от того, были ли вы скомпилированы с включенными или выключенными оптимизациями. Я собираюсь немного изменить вашу программу, чтобы проиллюстрировать разницу. Предположим, у вас было:
void Method()
{
AnotherMethod(new MyClass());
Console.WriteLine("Hello world");
}
При отключенной оптимизации мы иногда генерируем код, который будет выглядеть следующим образом:
void Method()
{
var temp = new MyClass();
AnotherMethod(temp);
Console.WriteLine("Hello world");
}
В неоптимизированной версии среда выполнения фактически выберет обработку объекта как недоступного для сбора до возврата метода после WriteLine. В оптимизированной версии среда выполнения может выбрать, чтобы объект считался коллекционируемым, как только возвращается AnotherMethod, перед строкой записи.
Причина различия заключается в том, что обеспечение более предсказуемого времени жизни объекта во время сеансов отладки часто помогает людям понять их программы.
Или он сразу удаляется?
Ничто не собирается сразу; сборщик мусора работает, когда кажется, что он должен работать. Если вам нужен какой-то ресурс, такой как дескриптор файла, который нужно сразу же очистить, когда вы закончите, используйте блок «using». Если нет, то пусть сборщик мусора решит, когда собирать память.
Нужно ли устанавливать его на нуль, чтобы GC заметил это быстрее?
Вам нужно установить что на ноль? Какую переменную вы имели в виду?
Несмотря на это, у вас нет , чтобы сделать что-нибудь, чтобы заставить сборщик мусора работать. Он работает сам по себе, просто отлично, без запроса от вас.
Я думаю, что вы думаете об этой проблеме. Пусть сборщик мусора сделает свое дело и не переживайте по этому поводу. Если у вас есть реальная проблема с памятью, которая не собирается своевременно, то покажите нам некоторый код, который иллюстрирует эту проблему; в противном случае просто расслабьтесь и научитесь любить автоматическое восстановление памяти.