В конце блока переменные, объявленные внутри блока, выходят из области видимости. Если они являются типами значений (например, int), они просто выталкиваются из стека. Если они являются ссылочными типами (как и большинство других объектов, например, StringBuilder
), то на них больше не будут ссылаться (если вы не передали их чему-либо за пределами блока, который все еще находится в области видимости), и сборщик мусора получит его через некоторое время .
Если у вас есть объекты, которые обращаются к дефицитным ресурсам, например, к различным классам на основе Stream
(или к чему-либо, что реализует IDisposable
), то вы должны поместить это в оператор using, например:
using (Stream s = GetStream())
{
// Do something with the stream.
}
В конце блока using вызывается метод Dispose
и освобождаются все ресурсы (такие как обработчики файлов, соединения с базой данных, большие куски памяти и т. Д.)
Как правило, вам не нужно понимать, когда именно сборщик мусора будет работать или освобождать память. Когда я перешел из C ++ в .NET в 2002 году, мне было очень трудно понять, когда я перешел с C ++ просто потому, что я привык вызывать delete
для любого объекта, который я создал в куче.
Вам больше не нужно беспокоиться об этом. Даже если вы забудете вызвать dispose, сборщик мусора рано или поздно доберется до него (хотя, вероятно, вы не захотите хранить этот дескриптор файла дольше, чем необходимо, поэтому IDisposable
)