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 шт):

Автор решения: CrazyElf

GC "подчистит" объект при выходе из метода/при очередной сборке мусора

Да, но когда именно вызовется GC и вызовется ли он вообще за время работы программы - неизвестно, нет никаких гарантий его вызова.

А если объект будет содержать управляемый ресурс из внешней библиотеки?

Dispose нужно вызывать в явном виде и лучше, конечно, с помощью using (есть два варианта - со скобками и без). Автоматически он не работает.

→ Ссылка
Автор решения: Alexander Petrov

GC "подчистит" объект при выходе из метода?

Нет, GC не триггерится при входе в метод или выходе из метода.

GC "подчистит" объект при очередной сборке мусора?

Опять же, нет. Если ссылка на объект ещё достижима, то он не будет собран.

А вот когда после выхода из метода объект станет недостижим и произойдёт сборка мусора, тогда он и будет собран.

А если объект будет содержать управляемый ресурс из внешней библиотеки? Достаточно ли будет реализации в UserClass метода Dispose и деконструктора для очистки этого ресурса?

Управляемый ресурс не нуждается в паттерне IDisposable. Он полностью подвластен сборщику мусора.

А вот неуправляемый ресурс нуждается в ручной очистке в финализаторе и/или методе Dispose.

→ Ссылка