null 의 Empty Factory 로 돌아 가지 않 기 위 한 응용 설명

3161 단어 nullEmptyFactory
많은 책 에서 null 대상 에 게 돌아 가지 말 라 는 제안 을 한 적 이 있다.예 를 들 어 아래 GetUsers 방법:Public class User{    public string Id { get; set; }    public string Name { get; set; }}public List GetUsers(){    List result = new List();    // search db for user    return result;}다른 방법 이 GetUsers Ofxxx,GetUsers ByXXX 와 같은 방법 이 라면 대량의 Listresult=new List()가 있 습 니 다.이 점 을 고려 하여 new List()를  방법 에 봉 인 했 습 니 다.이것 이 바로'공장'모드 입 니 다.List가 아 닐 수도 있 고 Stack일 수도 있 고 Observable Collection일 수도 있 기 때문에 범 형 에 맞 게 코드 는 다음 과 같 습 니 다.Public static class Empty Factory{    public static T Empty() where T : IEnumerable, new()    {        return new T();    }}사용:ListemptyList=new List();Stack emptyStack = new Stack();ObservableCollection emptyObserable = new ObservableCollection();emptyList = EmptyFactory.Empty>();emptyStack = EmptyFactory.Empty>();emptyObserable = EmptyFactory.Empty>();이렇게 쓰 면 요 구 를 만족 시 킬 수 있 지만 기본적으로 좋 을 것 이 없다 는 것 을 알 수 있다.Empty Factory 를 쓰 는 것 이 new 보다 빠 르 지 않다.하지만 캐 시 대상 이 된다 면 Empty Factory 가 도움 이 될 수 있 습 니 다.이 를 감안 하여 Empty Factory 에 캐 시 메커니즘 을 추가 하 는 코드 는 다음 과 같 습 니 다.Dictionary를 사용 하여

public static class EmptyFactory
{
    private static Dictionary<Type, object> cacheEmptyObjects =
                     new Dictionary<Type, object>();
    public static T Empty<T>() where T : IEnumerable, new()
    {
        Type genericType = typeof(T);
        if (cacheEmptyObjects.ContainsKey(genericType))
        {
            return (T)cacheEmptyObjects[genericType];
        }
        else
        {
            T tempEmptyObject = new T();
            cacheEmptyObjects.Add(genericType, tempEmptyObject);
            return tempEmptyObject;
        }
    }
}
테스트 코드 는 다음 과 같 습 니 다.
  image
그러나 이 방법 은 값 유형 에 있어 서 포장 이 필요 하 다 는 결함 이 있다.
그 근본 적 인 원인 은 Empty Factory 가 T 가 무엇 인지 모 르 기 때 문 입 니 다.Empty Factory 가 T 를 알 고 있다 면 Dictionary의 캐 시 를 사용 할 수 있 습 니 다.
이 문 제 를 해결 하 는 방향 은 Empty Factory 를 일반적인 유형 으로 바 꾸 는 것 이다.
코드 는 다음 과 같 습 니 다.
image
물론 Empty Factory.Empty()도 가능 합 니 다.
왜 Enumersble.Empty방법 을 사용 하지 않 습 니까?
Enumerable.Empty는 IEnumerable대상 을 되 돌려 주기 때 문 입 니 다.

좋은 웹페이지 즐겨찾기