[ 이슈 ]
클라이언트에서 관리하고 있는 Enum 형식의 데이터들을 서버로 전송해야되서 Enum 형을 int 형으로 캐스팅하려고 한다. 이 경우 바로 캐스팅하여 (int)EnumKind.EnumData1; 처럼 사용하면 될 것 같지만, Enum 형을 바로 int로 캐스팅할 경우 성능 저하가 발생한다. 성능저하를 최대한 줄이면서 캐스팅할 순 없을까?
[ 배경 지식 ]
1. 박싱 / 언박싱
C#에서는 데이터 형식을 값 형식과 참조 형식으로 나눈다.
값 형식은 스택 영역에 데이터가 생성되고, 참조 형식은 힙 영역에 데이터가 생성되는 차이점이 있다.
박싱이란 값 형식을 참조 형식으로 변환하는 행위이고 (스택 영역의 데이터를 힙 영역으로 복사),
언박싱은 반대로 참조 형식을 값 형식으로 변환하는 행위이다. (힙 영역의 데이터를 스택 영역으로 복사)
바로 이 박싱 과정에서 메모리(힙 영역) 할당이 일어나고, 이로 인해 GC가 해당 메모리에 대한 불필요한 추적 작업을 시작한다. 고작 캐스팅하나 하려고 GC까지 움직이는 것이다.
참고> https://grayt.tistory.com/87
2. Expression Class
C#에서는 Expression Class를 제공하여 개발자가 식 트리를 객체화하여 사용할 수 있게 해준다.
식 트리란 우리가 사용하는 식(a + b, c = d + e - f, ...)들을 분해하여 트리 형태로 만든 개념이다.
식 트리는 컴파일러 등을 만들 때 사용된다.
참고> https://qzqz.tistory.com/234
[ 해결 방안 ]
C#의 Expression 클래스를 사용하여 박싱 / 언박싱이 없는 캐스팅을 구현한다.
이와 관련한 스택 오버플로우 글을 참조하였다.
참고> https://stackoverflow.com/questions/1189144/c-sharp-non-boxing-conversion-of-generic-enum-to-int
'Development Experience > C#' 카테고리의 다른 글
C# data binding 시 TreeView 에서 depth가 2 이상일 때.. (ItemsSource를 사용하려면 항목 컬렉션이 비어 있어야 합니다 Error 대처법) (0) | 2020.01.02 |
---|---|
Telerik Winform에서 border의 색깔이 도저히 안 없어질때.. (0) | 2019.11.18 |
C# Memory Leak 해결 툴 (0) | 2019.10.07 |
C# Error Message : Cannot modify the return value of 'Collection<...>' because it is not a variable (0) | 2019.10.01 |
[Exception] 지정된 파일을 찾을 수 없습니다. (2) | 2019.01.14 |