c# - How can I implement Dispose for IDisposable without the code being recursive? -
i'm refactoring code, unleashing resharper on it, , came across this:
public virtual void dispose() { this.dispose(); }
...which r# flags potentially problematic "function recursive on paths"
which makes sense; however, "official" (straight horse's mouth) code similar (dispose calls dispose):
public void dispose() { dispose(true); // object cleaned dispose method. // therefore, should phone call gc.supressfinalize // take object off finalization queue // , prevent finalization code object // executing sec time. gc.suppressfinalize(this); }
...that code wont' compile, though; get, "no overload method 'dispose' takes '1' arguments"
so how can both implement dispose() , not create recursive?
updateif seek (from here):
try { dispose(true); //true: safe free managed resources } { base.dispose(); }
...i get, "'object' not contain definition 'dispose'" , "no overload method 'dispose' takes '1' arguments"
looks need implement dispose pattern correctly:
public class mythingwithresources : idisposable { ~mythingwithresources() { // finalizer , optional part. // finalizers not required, , // intended clearing unmanaged resources // class might hold // finalizers called garbage collector // can never sure when going // called. this.dispose(false); } public void dispose() { this.dispose(true); gc.suppressfinalize(this); } protected virtual void dispose(bool disposing) { if (disposing) { // if disposing true, method // beingness called part of managed disposal // means should safe dispose of managed // resources (.net classes such system.io.stream ) } // if disposing false, dispose method called // finaliser, you're in lastly chance saloon // far tidying stuff concerned. // unmanaged resources (and objects wrap them) // should tidied in scenario } }
c# garbage-collection resharper dispose idisposable
No comments:
Post a Comment