Skip to content

Instantly share code, notes, and snippets.

@orange-in-space
Last active November 29, 2019 19:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save orange-in-space/bfd686ea4af5052ae7c8ddb383412f13 to your computer and use it in GitHub Desktop.
Save orange-in-space/bfd686ea4af5052ae7c8ddb383412f13 to your computer and use it in GitHub Desktop.
C# 用参照カウンタのようなもの><
using System;
namespace RefCounterModokiDev
{
public interface IRefCounterInterface
{
/// <summary>
/// No need to care. ( for RefCounter.AddRef(). )
/// </summary>
RefCounter ReferenceCounterObject { get; set; }
void ReferenceCounterUpdate(int count);
bool ReferenceCounterAutoDispose { get; }
}
public class RefCounter : IDisposable
{
public static RefCounter AddRef(IRefCounterInterface target)
{
target.ReferenceCounterObject = RefCounter.AddRef(target.ReferenceCounterObject);
//target.ReferenceCounterObject += target.ReferenceCounterObject;
target.ReferenceCounterObject.Parent = target;
target.ReferenceCounterUpdate(target.ReferenceCounterObject.Count);
return target.ReferenceCounterObject;
}
private static RefCounter AddRef(RefCounter referenceObject)
{
if (referenceObject != null)
{
referenceObject.IncrementCounter();
return referenceObject;
}
else
{
return new RefCounter();
}
}
//yomiyasusa ga bimyou?><;
//
//public static RefCounter operator +(RefCounter z, RefCounter referenceObject)
//{
// return AddRef(referenceObject);
//}
//constructor
public RefCounter()
{
Count = 1;
}
public int Count { get; private set; } = 0;
public IRefCounterInterface Parent { get; set; }
public void Release() => Dispose();
public void Dispose()
{
if (Count > 0)
{
Count--;
}
Parent?.ReferenceCounterUpdate(Count);
if (Count < 1 && Parent != null && Parent.ReferenceCounterAutoDispose)
{
DisconnectCounter(true);
}
}
public void DisconnectCounter(bool dispose = false)
{
if (Parent != null)
{
Parent.ReferenceCounterObject = null;
if (dispose && Parent is IDisposable)
{
(Parent as IDisposable).Dispose();
}
Parent = null;
}
}
public void IncrementCounter()
{
Count++;
}
}
//--------------------------------------
/// <summary>
/// how to use!><
/// </summary>
public class DemoClass : IRefCounterInterface, IDisposable
{
public static void Demo()
{
DemoClass demoObject = new DemoClass();
//こうしても使えるし
RefCounter hDemoObject = RefCounter.AddRef(demoObject);
//usingでも使える><
using (RefCounter.AddRef(demoObject))
{
using (RefCounter.AddRef(demoObject))
{
}
}
hDemoObject.Release();
}
// do not care this
public RefCounter ReferenceCounterObject { get; set; }
public bool ReferenceCounterAutoDispose
{
get { return true; }
}
public void ReferenceCounterUpdate(int count)
{
System.Diagnostics.Debug.WriteLine(count);
}
void IDisposable.Dispose()
{
System.Diagnostics.Debug.WriteLine("Demo Class: Dispose");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment