Pergunta

realmente gostaria de ser capaz de decorar a minha classe com um atributo de algum tipo que iria impor o uso de uma instrução using para que a classe será sempre vazamentos de memória com segurança dispostos e evitar. Alguém sabe de técnica tal?

Foi útil?

Solução

Bem, há uma maneira que você poderia tipo de fazê-lo - só permitem o acesso ao seu objeto através de um método estático que leva um delegado. Como um exemplo muito simplificado (como, obviamente, há muitas maneiras diferentes de abrir um arquivo - leitura / gravação etc):

public static void WorkWithFile(string filename, Action<FileStream> action)
{
    using (FileStream stream = File.OpenRead(filename))
    {
        action(stream);
    }
}

Se as únicas coisas capazes de criar uma instância de seu objeto descartável são métodos dentro de sua própria classe, você pode garantir que eles sejam utilizados de forma adequada. É certo que não há nada para parar o delegado de tomar uma cópia da referência e tentar usá-lo mais tarde, mas isso não é exatamente o mesmo problema.

Esta técnica limita severamente o que você pode fazer com seu objeto, é claro -. Mas em alguns casos pode ser útil

Outras dicas

Você pode usar FxCop para aplicar esta regra. Veja a Wikipedia para um rápida visão geral .

Se você quiser garantir o seu objeto está sempre disposto, usar um finalizador em combinação com IDisposable.

Mas antes de fazer, ler sobre IDisposable e finalizadores, e estar consciente do fato de que você normalmente não precisa deles, a menos que a classe está fazendo algo como gerenciar o tempo de vida de um recurso não gerenciado.

Com um finalizador seu objeto será recuperado 'finalmente' se envolvido em um usando ou não. A instrução usando, que é uma conveniência para IDisposable, permite a limpeza determinística a ter lugar. A única ressalva é que objeto com finalizadores são mais caros para limpar e na vara geral em torno de memória por mais tempo enquanto aguardam finalização.

Quando eu preciso para implementar um finalizador ou IDisposable? ou technorabble: Usando Dispose, finalizadores e IDisposable

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top