GC и инициализация объекта в аргументах метода
Есть вот такой пример кода:
public void DoActions(UserClass MyClass)
{
//Actions with MyClass
}
Как поведет себя GC если я проинициализирую UserClass прямо в аргументах метода? Т.е. :
DoActions(new UserClass());
Правильно ли я понимаю, что GC "подчистит" объект при выходе из метода/при очередной сборке мусора? А если объект будет содержать управляемый ресурс из внешней библиотеки? Достаточно ли будет реализации в UserClass метода Dispose и деконструктора для очистки этого ресурса? Т.е. например вот так:
public class UserClass : IDisposable
{
public ClassFromExtendLibrary Memory; //Например какой-нибудь класс из внешней библиотеки реализующий внутри интерфейс IDisposable
public int[] SomeArray;
private bool _disposed = false;
//some code
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(_disposed) return;
if(disposing)
{
SomeArray = null;
Memory?.Dispose();
}
_disposed = true;
}
~UserClass()
{
Dispose(false);
}
}
Ответы (2 шт):
GC "подчистит" объект при выходе из метода/при очередной сборке мусора
Да, но когда именно вызовется GC и вызовется ли он вообще за время работы программы - неизвестно, нет никаких гарантий его вызова.
А если объект будет содержать управляемый ресурс из внешней библиотеки?
Dispose нужно вызывать в явном виде и лучше, конечно, с помощью using (есть два варианта - со скобками и без). Автоматически он не работает.
GC "подчистит" объект при выходе из метода?
Нет, GC не триггерится при входе в метод или выходе из метода.
GC "подчистит" объект при очередной сборке мусора?
Опять же, нет. Если ссылка на объект ещё достижима, то он не будет собран.
А вот когда после выхода из метода объект станет недостижим и произойдёт сборка мусора, тогда он и будет собран.
А если объект будет содержать управляемый ресурс из внешней библиотеки? Достаточно ли будет реализации в UserClass метода Dispose и деконструктора для очистки этого ресурса?
Управляемый ресурс не нуждается в паттерне IDisposable. Он полностью подвластен сборщику мусора.
А вот неуправляемый ресурс нуждается в ручной очистке в финализаторе и/или методе Dispose.