개발 5

[C#] CustomEventHandler

타 대상에게 일어나는 특정 이벤트에 대한 처리를 일괄적으로 하고싶었음 여러 이벤트를 한 번에 관리하고 싶어서 EventHandlerList를 사용하였음 EventHandlerList의 key 오브젝트를 한 번에 관리 & 재사용을 하고 싶어 이전에 제작한 ObjectPool을 사용함 2023.12.07 - [개발/C#] - [C#] ObjectPool public class EventKey : IRecycle { public void Reset() { } } public class CustomEventArgs : EventArgs, IRecycle { public object?[]? Values { get; private set; } public void Set(params object?[]? values..

개발/C# 2023.12.12

[C#] Bools

bool값을 DB 등에 저장할 때 일일히 저장하기 어려운 점 때문에 비트 플래그를 사용하는 경우가 있음 그러나 비트 플래그는 잘 쓰이는 방식이 아니다보니 익숙하지 않아 사용하기 어려움 따라서 비트 플래그 계산을 사용할 수 있으면서 동시에 사용하기 편하고, DB 저장이 용이하면서 다수의 bool값을 묶어서 쓸 수 있는 자료구조를 제작 short(16비트), int(32비트), long(64비트) 형의 Bools 자료구조를 각각 제작 (bool의 개수는 각 비트의 개수와 동일) 실제 short/int/long형의 형변환이 자유로울 수 있도록 암시적 형변환 추가 public struct ShortBools { public static string IndexOutOfRangeExceptionMessage(byt..

개발/C# 2023.12.09

[C#] ObjectPool

잦은 new() 호출로 인한 메모리 누수를 방지하기 위해 object 재사용이 필요했음 thread-safe하며 object 재사용이 가능한 ObjectPool이 필요하여 자료 구조 클래스를 제작 최초 생성 시 미리 만들어둘 object의 개수를 지정할 수 있도록 함(default는 256개) 잘 못 반환되지 않도록 본인이 생성한 object를 등록 후 반환 시 검사 사용 가능한 상태의 object를 thread-safe한 Queue에서 가져가도록 함 만약 현재 사용 가능한 상태의 object가 없다면(생성된 object가 모두 사용 중) 새로 생성하여 pool에 등록 후 지급 사용 완료 후 반납하였을 때 일괄적으로 초기화를 해주기 위해 Reset()를 반드시 재정의해야하는 IRecycle 인터페이스를 ..

개발/C# 2023.12.07

[C#] ConcurrentList

thread-safe하게 read, write가 가능하고 인덱서 사용이 가능한 List가 필요하여 생성한 자료구조 클래스 ReaderWriterLockSlim을 사용하여 필요 자원 잠금 try문의 finally를 이용하여 작업 진행 후 Lock 해제 코드 재사용성을 위해 일괄적으로 내부에서 lock 사용 및 대리자를 호출하는 함수 사용 public class ConcurrentList { ~ConcurrentList() { _lockSlim?.Dispose(); } public T? this[int index] { get { if (index < 0 || _values.Count _values[index]); } set { if (index < 0 || _values.Count _values[index]..

개발/C# 2023.12.06

[C#] Singleton

Singleton 최초의 호출 시 단 한 번만 생성하고 이후에는 최초 생성된 객체를 호출되게끔 사용하는 디자인 패턴 싱글턴 패턴을 상속받아 사용할 수 있는 클래스로 만듬 생성자가 thread-safe 할 수 있도록 Lazy 클래스를 사용 public class Singleton where T : class, new() { private static readonly Lazy _instance = new(() => new T()); public static T Instance { get { return _instance.Value; } } } Git : https://github.com/ChoiMingyeong/Devoram.git/ GitHub - ChoiMingyeong/Devoram: Devoram E..

개발/C# 2023.12.05