2008-09-11 4 views
18

shown입니다. '캐스팅'은 프리픽스 캐스팅보다 훨씬 빠르지 만 '반사'는 무엇입니까? 얼마나 나빠? 상상할 수있는 것처럼 Google에서 '검색 함'을 검색하는 것은 대단히 효과적이지 않습니다.C#의 'is'reflection의 성능 특성은 무엇입니까?

+2

'is is very very fast. –

+0

나는 중복 된 질문을 닫는 데있어서 날짜가 유일한 결정 요인이 아니라는 사실을 알고 있습니다.하지만 다른 질문이 게시되기 전에 제 질문이 게시되고 응답되고 upvoted되었습니다. _It_은 중복 된 것이지,이 것이 아닙니다. –

답변

19

몇 가지 옵션이 있습니다 :

고전 캐스트
  1. : Foo foo = (Foo)bar
  2. as 캐스트 연산자 : Foo foo = bar as Foo
  3. is 시험 : bool is = bar is Foo

  1. bar 안전하게 (빠른) Foo으로 변환 할 수 있는지 확인하는 데 필요고전 캐스트, 다음은 실제로 (느린)을, 또는 (아주 천천히) 예외를 throw합니다.
  2. bar가 캐스팅 될 수있는 경우 다음 캐스트를 수행하거나 안전하게 캐스트 할 수없는 경우, 그것은 단지 null를 반환 확인해야as 연산자.
  3. is 연산자bar이 Foo로 캐스트 될 수 있는지 확인하고 boolean을 반환합니다. 그것은 단지 전체 주조 작업의 첫 번째 부분을 수행하기 때문에

is 테스트, 빠른이다. as 연산자는 캐스트가 실패 할 경우 예외를 throw하지 않기 때문에 클래식 캐스트보다 빠릅니다 (캐스트가 실패 할 수 있다고 합법적으로 예상하는 상황에 적합).

그냥 변수 bar 당신이 barFoo 경우 테스트 할거야 경우 Foo 다음의 is 운영자, 하지만를 사용하는 경우 알고 싶다면, 그렇다면, 다음 캐스팅이면 as 연산자를 사용해야합니다.

본질적으로 모든 캐스트는 캐스트가 유효한지 확인하기 위해 내부적으로 is 체크와 동등한 작업을 수행해야합니다. 따라서 is 체크를 수행하고 전체 캐스트 (as 캐스트 또는 클래식 캐스트 연산자)를 수행하면 is 검사를 두 번 수행하는 것이 약간의 추가 오버 헤드가됩니다.

+3

체크가 가장 느립니다. 참조 유형을 반환하기 때문에 캐스트가 참조 유형에 대해 매우 빠릅니다. –

+0

이 한 가지 대답은 저에게 아이디어를 얻는데 도움이되었습니다 .. – nawfal

6

"is"는 "isinst"IL 연산자와 기본적으로 동일합니다.

3

중요하지 않아도 될만큼 빠릅니다.

if (obj is Foo) { 
    Foo f = (Foo)obj; 
    f.doSomething(); 
} 

사양이 낮은 : 당신이

7

설계 내가 배운 방법을 재고 할 필요가 성능에 눈에 띄는 영향을 미칠 수 있도록하기 위해 당신이 객체만큼의 유형을 확인하는 경우는이 때문이다 :

Foo f = obj as Foo; 
if (f != null) { 
    f.doSomething(); 
} 

문제가 될만큼 충분히 느린가요? 아마 아니지만,주의를 기울이는 것이 너무 간단합니다. 그렇게 할 수도 있습니다.

관련 문제