Skip to content

Instantly share code, notes, and snippets.

@uladz-zubrycki
Last active October 16, 2021 16:09
Show Gist options
  • Select an option

  • Save uladz-zubrycki/901b6194167834658235dad6c84f81a0 to your computer and use it in GitHub Desktop.

Select an option

Save uladz-zubrycki/901b6194167834658235dad6c84f81a0 to your computer and use it in GitHub Desktop.
Disposable delegate
public static class Disposable
{
public static IDisposable Create(Action dispose) =>
new DisposableAction(dispose);
public static IAsyncDisposable Create(Func<ValueTask> dispose) =>
new AsyncDisposableAction(dispose);
private sealed class DisposableAction: IDisposable
{
private readonly Action dispose;
private bool isDisposed;
public DisposableAction(Action dispose)
{
this.dispose = dispose ?? throw new ArgumentNullException(nameof(dispose));
}
public void Dispose()
{
if (isDisposed)
{
return;
}
isDisposed = true;
this.dispose();
}
}
private sealed class AsyncDisposableAction: IAsyncDisposable
{
private readonly Func<ValueTask> dispose;
private bool isDisposed;
public AsyncDisposableAction(Func<ValueTask> dispose)
{
this.dispose = dispose ?? throw new ArgumentNullException(nameof(dispose));
}
public ValueTask DisposeAsync()
{
if (isDisposed)
{
return default;
}
isDisposed = true;
return this.dispose();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment