Log Stash

as an Industrial Personnel

dictionary 2

C#에서 Dictionary에 Enum을 써도 괜찮은것 같다

전에 이런 글에서 Dictionary에 Key값으로 enum을 넣으면 내부에서 boxing이 일어나는데, 그 이유는 Dictionary 내부에서 IEqualityComarer로 ObjectEqualityComparer를 사용하게 되기 때문이라고 했다. 4 버전대 이상 닷넷에선 EqualityComparer.CreateComparer()의 로직이 바뀌었고, 이젠 타입이 enum인지 아닌지를 봐서 EnumEqualityComparer라는 전용 비교자를 만들어 넘겨준다. 진짜 그런지 한번 들여다 본다. C# v.3.5 일단 닷넷 버전 3.5에서 진짜 boxing을 하는지 IL만 잠깐 살펴보도록 한다. 테스트 코드는 아래처럼 작성했는데, 아무래도 상관 없다. 어차피 mscorlib 안쪽만 볼 예정이다. clas..

Note 2019.12.23

TIL: C#에서 enum이나 struct를 Dictionary의 Key값으로 사용하면 쓰레기가 생긴다

C#에서 enum값은 레퍼런스 타입이 아니다. 때문에 평소에 이리저리 값을 넘기고 받을 때 동적할당, 박싱/언박싱에대한 죄책감을 느끼지 않으며 쓰고 있었다. 하지만 알고보니 enum이 Dictionary의 키값으로 쓰이게 되면, Dictionary 내부에서 키값들이 같은지 비교할 때 enum을 박싱하면서 쓰레기가 생기게 된다. 예를 들면 이렇게 enum SomeType { None, Gold, Point, Cash, } Dictionary type2Asdf = new Dictionary(); 별 생각없이 Key자리에 enum을 넣어 왔었는데. 이렇게 하면 Dictionary내부에 쓰레기가 생긴다. Dictionary에서는 키값이 같은지 여부를 판별할때 IEqualityComarer라는 인터페이스를 사용한..

Note 2017.07.06