| File: AssemblyDependency\DisposableBase.cs | Web Access |
| Project: src\msbuild\src\Tasks\Microsoft.Build.Tasks.csproj (Microsoft.Build.Tasks.Core) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; namespace Microsoft.Build.Tasks { // // Abstract base class to implement IDisposable interface. // internal abstract class DisposableBase : IDisposable { private bool _disposed; // Constructor protected DisposableBase() { _disposed = false; } // Use C# destructor syntax for finalization code. // This destructor will run only if the Dispose method // does not get called. // It gives your base class the opportunity to finalize. // Do not provide destructors in types derived from this class. ~DisposableBase() { // Do not re-create Dispose clean-up code here. // Calling Dispose(false) is optimal in terms of // readability and maintainability. Dispose(false); } // Implement IDisposable. // Do not make this method virtual. // A derived class should not be able to override this method. public void Dispose() { // This object will be cleaned up by the Dispose method. // Therefore, you should call GC.SupressFinalize to // take this object off the finalization queue // and prevent finalization code for this object // from executing a second time. Dispose(true); GC.SuppressFinalize(this); } // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user's code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by the // runtime from inside the finalizer and you should not reference // other objects. Only unmanaged resources can be disposed. private void Dispose(bool disposing) { // Check to see if Dispose has already been called. if (!_disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if (disposing) { // Dispose managed resources. DisposeManagedResources(); } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. DisposeUnmanagedResources(); } _disposed = true; } // Can be overridden by derived classes to dispose managed resources. protected virtual void DisposeManagedResources() { } // Can be overridden by derived classes to dispose unmanaged resources. protected virtual void DisposeUnmanagedResources() { } } }