É possível impor o uso de uma instrução using em C #
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?
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