C#에서 'is' 리플렉션의 성능 특성은 무엇입니까?[복제하다]

StackOverflow https://stackoverflow.com/questions/57701

  •  09-06-2019
  •  | 
  •  

문제

이 질문에는 이미 답변이 있습니다.

그것은 표시됨 'as' 캐스팅은 접두사 캐스팅보다 훨씬 빠르지만 'is' 리플렉션은 어떻습니까?얼마나 나빠?상상할 수 있듯이 Google에서 'is'를 검색하는 것은 그다지 효과적이지 않습니다.

도움이 되었습니까?

해결책

몇 가지 옵션이 있습니다:

  1. 그만큼 클래식 캐스트: Foo foo = (Foo)bar
  2. 그만큼 as 캐스트 연산자: Foo foo = bar as Foo
  3. 그만큼 is 시험: bool is = bar is Foo

  1. 그만큼 클래식 캐스트 있는지 확인해야합니다 bar 안전하게 캐스팅할 수 있습니다. Foo (빠름) 그런 다음 실제로 수행하거나(느리게) 예외를 발생시킵니다(정말 느림).
  2. 그만큼 as 운영자 있는지 확인해야합니다 bar 캐스팅할 수 있으면 캐스팅을 수행하고, 안전하게 캐스팅할 수 없으면 그냥 반환됩니다. null.
  3. 그만큼 is 운영자 그냥 확인해 보면 bar Foo로 캐스팅하고 boolean.

그만큼 is 전체 주조 작업의 첫 번째 부분만 수행하므로 테스트가 빠릅니다.그만큼 as 연산자는 캐스트가 실패하더라도 예외를 발생시키지 않기 때문에 클래식 캐스트보다 빠릅니다(이는 캐스트가 실패할 것으로 합법적으로 예상되는 상황에 적합합니다).

변수가 있는지 알아야 하는 경우 barFoo 그런 다음 is 운영자, 하지만, 테스트하려는 경우 barFoo, 그렇다면, 그럼 캐스팅해, 그런 다음 as 운영자.

기본적으로 모든 캐스트는 is 캐스트가 유효한지 확인하기 위해 내부적으로 먼저 확인하십시오.그래서 만약 당신이 is 확인 후 전체 캐스트(또는 as 캐스트 또는 클래식 캐스트 연산자를 사용하여) 효과적으로 수행하고 있습니다. is 두 번 확인하세요. 이는 약간의 추가 오버헤드입니다.

다른 팁

제가 배운 방법은 다음과 같습니다.

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

이보다 느립니다:

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

문제가 될 만큼 느린가요?아마도 아닐 수도 있지만 주의를 기울이는 것은 매우 간단한 일이므로 그렇게 하는 것이 좋습니다.

"is"는 기본적으로 "isinst" IL 연산자와 동일합니다. 해당 기사에서는 이를 빠르다고 설명합니다.

문제가 되지 않을 정도로 빨라야 합니다.성능에 눈에 띄는 영향을 미칠 만큼 개체의 유형을 확인하고 있다면 디자인을 재고해야 합니다.

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