Files
Continentis/Assets/Plugins/UniRx/Scripts/Disposables/MultipleAssignmentDisposable.cs
SoulliesOfficial d09b58fd80 架构大更
2026-03-20 11:56:50 -04:00

63 lines
1.4 KiB
C#

using System;
namespace UniRx
{
public sealed class MultipleAssignmentDisposable : IDisposable, ICancelable
{
private static readonly BooleanDisposable True = new(true);
private IDisposable current;
private readonly object gate = new();
public IDisposable Disposable
{
get
{
lock (gate)
{
return current == True
? UniRx.Disposable.Empty
: current;
}
}
set
{
var shouldDispose = false;
lock (gate)
{
shouldDispose = current == True;
if (!shouldDispose) current = value;
}
if (shouldDispose && value != null) value.Dispose();
}
}
public bool IsDisposed
{
get
{
lock (gate)
{
return current == True;
}
}
}
public void Dispose()
{
IDisposable old = null;
lock (gate)
{
if (current != True)
{
old = current;
current = True;
}
}
if (old != null) old.Dispose();
}
}
}