using System; using System.Threading; namespace AspClassic.Scripting; public sealed class ScopeVariable : IScopeVariable, IWeakReferencable { private object _value; private WeakReference _weakref; private static readonly object _novalue = new object(); public bool HasValue => _value != _novalue; public WeakReference WeakReference { get { if (_weakref == null) { _weakref = new WeakReference(this); } return _weakref; } } internal ScopeVariable() { _value = _novalue; } public bool TryGetValue(out dynamic value) { value = _value; if ((object)value != _novalue) { return true; } value = null; return false; } public void SetValue(object value) { _value = value; } public bool DeleteValue() { return Interlocked.Exchange(ref _value, _novalue) != _novalue; } }