2025-08-20 02:24:48 +08:00

95 lines
1.5 KiB
C#

using System;
public abstract class ViProvider<T>
where T : struct
{
public abstract T Value { get; }
}
public class ViSimpleProvider<T> : ViProvider<T>
where T : struct
{
public ViSimpleProvider() { }
public ViSimpleProvider(T value) { _value = value; }
public override T Value { get { return _value; } }
public void SetValue(T value) { _value = value; }
T _value;
}
public class ViPtrProvider<T>
where T : class
{
public static implicit operator T(ViPtrProvider<T> ptr)
{
if (System.Object.ReferenceEquals(ptr, null))
{
return null;
}
else
{
return ptr._obj;
}
}
public ViPtrProvider()
{
}
public ViPtrProvider(T obj)
{
Set(obj);
}
public ViPtrProvider(ViPtrProvider<T> ptr)
{
Set(ptr._obj);
}
public void Clear()
{
_obj = null;
}
public void Set(T obj)
{
_obj = obj;
}
T _obj;
}
public class Demo_Provider
{
public class ViPtrProviderClass
{
ViPtrProvider<ViPtrProviderClass> _ptrProvider = new ViPtrProvider<ViPtrProviderClass>();
public static implicit operator ViPtrProvider<ViPtrProviderClass>(ViPtrProviderClass obj)
{
if (!System.Object.ReferenceEquals(obj, null))
{
return obj._ptrProvider;
}
else
{
return null;
}
}
public ViPtrProviderClass()
{
_ptrProvider.Set(this);
}
public void Clear()
{
_ptrProvider.Clear();
}
}
public static void Test()
{
ViPtrProviderClass obj = new ViPtrProviderClass();
ViPtrProvider<ViPtrProviderClass> ptr = obj;
ViPtrProviderClass obj2 = ptr;
obj.Clear();
ViPtrProviderClass obj4 = ptr;
}
}