| File: System\DisposableBase.cs | Web Access |
| Project: src\winforms\src\System.Private.Windows.Core\src\Microsoft.Private.Windows.Core.csproj (Microsoft.Private.Windows.Core) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. namespace System; /// <summary> /// Base class for implementing <see cref="IDisposable"/> with double disposal protection. /// </summary> internal abstract class DisposableBase : IDisposable { private int _disposedValue; protected bool Disposed => _disposedValue != 0; /// <summary> /// Called when the component is being disposed or finalized. /// </summary> /// <param name="disposing"> /// <see langword="false"/> if called via a destructor on the finalizer queue. Do not access object fields /// unless <see langword="true"/>. /// </param> protected abstract void Dispose(bool disposing); private void DisposeInternal(bool disposing) { // Want to ensure both paths are guarded against double disposal. if (Interlocked.Exchange(ref _disposedValue, 1) == 1) { return; } Dispose(disposing); } /// <summary> /// Disposes the component. /// </summary> public void Dispose() { DisposeInternal(disposing: true); GC.SuppressFinalize(this); } /// <summary> /// <see cref="DisposableBase"/> with a finalizer. /// </summary> public abstract class Finalizable : DisposableBase { ~Finalizable() => DisposeInternal(disposing: false); } }