문제

독서를 통해 제네릭 주위에 머리를 잡으려고 Juval Lowy 의이 깨달음 기사

Paraphrasing .. 일반 클래스 정의를 정의 할 때 IL로 컴파일됩니다.

  • 값 유형의 경우 특정 값 유형을 요청하자마자 T를 특정 값 유형으로 대체하여 해당 특정 구성의 IL을 얻습니다. MyList<int> 혜택 : 권투 및 무 복원 처벌이 없습니다.
  • 참조 유형의 경우, 컴파일러는 정의의 T의 모든 인스턴스를 객체로 대체하고 모든 Ref 유형에 사용되는 IL을 생성합니다. 그러나 인스턴스는 실제 요청 된 심판 유형에 따라 할당됩니다. MyList<String>

이제 전 세계 우리는 취하는 방법을 작성할 수있었습니다 Object 매개 변수. 제네릭은 100% 성능 향상을 주장합니다.사용하려는 경우 객체 유형을 특정 유형으로 다운 캐스트 할 때 발생하는 성능 페널티를 피합니다. '

 // assume GetItem returns an Object
 string sMyPreciousString = (string) obList.GetItem(); 

객체에서 특정 참조 유형으로 다운 캐스트 될 때이 성능은 무엇입니까? 또한 객체에 대한 상향 캐스팅처럼 보입니다 (제네릭조차도 이것을 할 것입니다).

도움이 되었습니까?

해결책

객체로 향상시키는 데 실행 시간 점검이 필요하지 않습니다. 항상 작동하며 기본적으로 NO -OP입니다.

다운 캐스팅에는 예를 들어 스트림을 문자열에 캐스팅하지 않도록 실행 시간 점검이 필요합니다. 그것은 꽤 작은 형벌이며, 병목 현상이 될 가능성이 거의 없지만, 피하는 것은 제네릭에 대한 추가 이점 일뿐입니다.

다른 팁

성능 히트는 실행 시간 유형 검사의 필요성에서 비롯됩니다. B가 A의 서브 클래스 인 경우 B를 A에 시전하면 컴파일 시간에 모든 BS가 있기 때문에 안전하다는 것을 알 수 있습니다. 따라서 유형을 확인하기 위해 런타임 코드를 생성 할 필요가 없습니다.

그러나 A를 B에 시전하면 A가 실제로 B인지 아닌지 컴파일 시간에 알 수 없습니다. A는 A 일 수 있고 A 형, A의 다른 하위 유형 일 수 있습니다. 따라서 객체가 실제로 B인지 확인하고 그렇지 않은 경우 예외를 던지는 런타임 코드를 생성해야합니다.

컴파일러는 컴파일 시간에 BS 만 데이터 구조에 넣었다는 것을 알고 있기 때문에 제네릭은이 문제가 없습니다. 실행 시간에 확인을 입력하십시오.

생성되는 IL에 대한 읽기 (이것은 기사 언급) ... aha- isinst.

다운 캐스팅이 아니었다면 전화 할 필요가 없습니다. isinst.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top