728x90

enum과, struct는 값 타입이기 때문에 힙에 할당을 하지 않으므로 가비지가 생성되지 않는다.

하지만 Dictionary를 사용함으로써 enum이나 structkey로 사용할 경우 가비지가 발생되게 된다.

 

이유는 Dictionary에서는 키값이 같은지 여부를 판단할 때 System.Collections.Generic 네임스페이스 내부에 존재하는 IEqualityComparer 인터페이스를 사용하는데

 

따로 Dictionary에 비교자 객체를 집어 넣지 않는다면 비교자 객체의 기본값은 EqualityComparer<T>.Default가 되고 이 Default 프로퍼티는 T타입이 System.IEquatable<T>을 따로 구현하지 않았을 경우에 EqualityComparer<T>를 반환하는데, 얘는 Object.Equals, Object.GetHashCoe를 기본 비교 함수들로 사용한다는 것이다.

enum과 struct는 비교 함수들이 따로 구현되어 있지 않기 때문에 key로 사용하게되면

결국 저 두 함수를 통하여 enum이든 struct든 값이 object로 박싱이 되버리니 가비지가 생기게 된다는 것이다.

 

해결책은 EqualityComparer<T> 인터페이스를 상속받는 클래스를 선언해서 비교하게 하는 방법이다

이것은 struct나, enum 똑같다. 

 

public enum SomeType 
{ 
    EnumA = 1, 
    EnumB = 2, 
} 

public class SomeTypeComparer IEqualityComparer<SomeType>

    bool IEqualityComparer<SomeType>.Equals(SomeType a, SomeType b) { return a == b; } 
    int IEqualityComparer<SomeType>.GetHashCode(SomeType obj) { return (int)obj; } 
}

 

위와 같이 IEqualityComparer<T> 인터페이스를 상속받는 클래스를 선언하고

Dictionary 인스턴스를 생성할때 생성자에 인스턴스를 넣어주면 된다.

 

Dictionary<SomeTypeint> dic = new Dictionary<SomeTypeint>(new SomeTypeComparer());

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침