Last active
November 29, 2019 19:20
-
-
Save orange-in-space/bfd686ea4af5052ae7c8ddb383412f13 to your computer and use it in GitHub Desktop.
C# 用参照カウンタのようなもの><
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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