Efficient C\#: 왜 범 형 을 반환 값 으로 합 니까?

4718 단어
http://www.cnblogs.com/luminji/archive/2010/11/08/1871782.html
최근 에 범 형 반환 값 에 관 한 문 제 를 풀 었 더 니:
1: 많은 사람들 이 잘못 했다.
2: 많은 사람들 이 범 형 이 반환 치 로 서 어떤 의미 가 있 는 지 의문 이다.
 
제목 은 다음 과 같다.
"함 수 를 만 듭 니 다. 입력 을 요구 하 는 인자 와 출력 결 과 는 모두 일반적인 것 입 니 다."
 (PS: 댓 글 에서 문제 자체 에 문제 가 있다 는 지적 이 있 습 니 다. 더 적합 한 설명 은 함 수 를 만 드 는 것 입 니 다. 입력 매개 변수 와 반환 값 을 요구 하 는 유형 은 모두 일반적인 형식 매개 변수 입 니 다)
전형 적 인 잘못된 대답 중 하나:
        public List<T> Function<T, U>(U parameter)
        {
            return new List<T>(); 
        }

 
전형 적 인 오 답 의 두 번 째:
        void GetList<T>(ref T t1, out T t2) where T : List<T>
        {
            t2 = t1;
        }

 
잘못된 대답 1 은 범 형 을 생각하면 많은 사람들 이 집합 을 생각 하기 때문이다. 그래, 범 형 집합 은 범 형의 중요 한 응용 장면 이지 만 이것 은 범 형 자체 와 무슨 관계 가 있 는가.
 
많은 사람들 이 자 연 스 럽 게 두 번 째 의문 을 제기 합 니 다. 그러면 팬 형 을 반환 값 으로 하 는 것 이 무슨 의미 가 있 습 니까? 우 리 는 먼저 아래 의 예 를 살 펴 보 겠 습 니 다.
        public T GetActivatedServer<T>(NetIdentity netIdentity, string name)
        {
            string url = netIdentity.GetRemoteBaseUrl() + name;
            object service = Activator.GetObject(typeof(T), url);
            return (T)service;
        }

 
이것 은 remoting 의 한 예 입 니 다. 완 성 된 기능 은 원 격 대상 의 인 스 턴 스 를 되 돌려 주 는 것 입 니 다.만약 범 형 이 없다 면, 우 리 는 모든 원 격 대상 의 실례 를 만 들 기 위해 하나의 방법 을 세 워 야 하 며, 범 형 이 생기 면 이 문 제 를 쉽게 해결 할 수 있다.(PS: 이 글 은 타당 하지 않 습 니 다. 댓 글 에서 '범 형 이 없 을 때 우 리 는 Type 을 전달 하고 밖에서 유형 전환 을 강제 할 수 있 습 니 다' 라 고 지적 하 였 습 니 다. 그래서 본 글 에서 말 한 '이 문 제 를 해결 합 니 다' 중의 이 문 제 는 인 코딩 이 더욱 적 고 아름 다 우 며 '범 형 을 사용 하 는 것 이 효율 적 이 고 유형 이 안전 하 다' 는 것 을 말 하 는 것 이 아 닙 니 다.)
호출 된 코드 는:
IClientContract client = RemoteObjectManager.Manager.GetActivatedServer<IClientContract>(target, "Client");

 
또한 LINQ 에 대해 잘 알 고 계 신다 면 LINQ 에서 도 일반적인 반환 값 을 사용 하 는 방법 이 적지 않 을 것 입 니 다. 유용 한 집합 방법 Find 를 들 어 보 겠 습 니 다. 다음은 이 방법의 표준 실현 (. NET 내부 코드) 입 니 다.
    public T Find(Predicate<T> match)
    {
      if (match == null)
      {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
      }
      for (int i = 0; i < this._size; i++)
      {
        if (match(this._items[i]))
        {
          return this._items[i];
        }
      }
      return default(T);
    }

표준 호출 코드:
            MarshalByRefObject marshal = ObjRefList.Find(target =>
            {
                return target.GetType() == obj.GetType();
            });

 
마지막 으로 본 문제 의 정 답 을 동봉 합 니 다.
        TResoult GetT<TResoult, T1>(T1 t)
        {
            //some biz code 
            return default(TResoult);
        }

좋은 웹페이지 즐겨찾기