Sobes.tech
Junior — Middle

Já utilizaste recursos não gerenciados ao desenvolver em C#?

sobes.tech IA

Resposta da IA

Sim, em C# ao trabalhar com recursos não gerenciados, como descritores de ficheiros, ligações a bases de dados ou ponteiros de memória, é importante libertar esses recursos corretamente para evitar fugas de memória e outros problemas. Para isso, geralmente implementa-se a interface IDisposable e o método Dispose(), onde se libertam os recursos não gerenciados.

Exemplo:

class UnmanagedResourceHolder : IDisposable
{
    private IntPtr unmanagedPointer; // recurso não gerenciado
    private bool disposed = false;

    public UnmanagedResourceHolder()
    {
        // alocação do recurso não gerenciado
        unmanagedPointer = /* chamada à API */ IntPtr.Zero;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (unmanagedPointer != IntPtr.Zero)
            {
                // libertar o recurso não gerenciado
                // por exemplo, chamada à API nativa
                unmanagedPointer = IntPtr.Zero;
            }
            disposed = true;
        }
    }

    ~UnmanagedResourceHolder()
    {
        Dispose(false);
    }
}

Desta forma, a libertação de recursos não gerenciados é controlada manualmente, o que previne fugas.