J'ai beaucoup de classes comme celle - ci, et ma recommandation est de faire de la classe scellée chaque fois que possible. IDisposable
+ héritage peuvent travailler, mais 99% du temps, vous n'avez pas besoin, et il est facile de faire des erreurs avec.
Sauf si vous écrivez une API publique (dans ce cas, il est bon de permettre à des personnes de mettre en œuvre votre code toutefois ils le souhaitent à - dire d'utiliser IDisposable
), vous n'avez pas besoin de le soutenir.
juste à faire:
public sealed class Foo : IDisposable
{
private StreamWriter _Writer;
public Foo(string path)
{
FileStream fileWrite = File.Open (path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
try {
_Writer = new StreamWriter (fileWrite, new ASCIIEncoding());
} catch {
fileWrite.Dispose();
throw;
}
}
public void Dispose()
{
_Writer.Dispose();
}
}
Remarque le try...catch; techniquement, l' StreamWriter
constructeur pourrait lancer une exception, dans ce cas il ne prend jamais la propriété de l' FileStream
et vous devez vous débarrasser vous-même.
Si vous êtes vraiment en utilisant de nombreux IDisposable
s, envisager de mettre ce code en C++/CLI: c'est tout ce que le code réutilisable pour vous (de manière transparente des déterministe destruction tech pour les deux natifs et les objets gérés).
Wikipedia a une bonne IDisposable de l'échantillon pour le C++ (vraiment, si vous avez beaucoup de IDisposable, de C++ est en fait beaucoup plus simple que le C#):
Wikipédia: C++/CLI Finaliseurs et variables automatiques.
Par exemple, la mise en œuvre d'un "coffre-fort" contenant jetable en C++/CLI ressemble...
public ref class MyDisposableContainer
{
auto_handle<IDisposable> kidObj;
auto_handle<IDisposable> kidObj2;
public:
MyDisposableContainer(IDisposable^ a,IDisposable^ b)
: kidObj(a), kidObj2(b)
{
Console::WriteLine("look ma, no destructor!");
}
};
Ce code permettra d'éliminer correctement les kidObj et kidObj2 même sans l'ajout d'une coutume IDisposable mise en œuvre, et il est robuste aux exceptions soit Disposer de mise en œuvre (pas que celles-ci doivent se produire, mais quand même), et simple à maintenir dans le visage de beaucoup plus d' IDisposable
des membres ou des ressources autochtones.
Non pas que je suis un grand fan de C++/CLI, mais fortement axée sur les ressources de code, on a C# battre facilement, et il est absolument génial interop à la fois avec code natif et géré, bref, parfait colle le code ;-). J'ai tendance à écrire de 90% de mon code en C#, mais l'utilisation de C++/CLI pour tous les besoins d'interopérabilité (esp. si vous voulez l'appeler toute fonction win32 - MarshalAs et d'autres interop attributs de tous sur la place sont horrible et complètement incompréhensible).