당신의 이해는 사실입니다. 그것은 나에게 미세 최적화하려고하는 것 같습니다. 유형이 확실하면 일반 캐스트를 사용해야합니다. 더 현명한 예외를 생성하는 것 외에도 빠르게 실패합니다. 유형에 대한 당신의 가정에 대해있는 거 잘못이 경우, 프로그램이 즉시 실패하고 당신은을 위해 장애 것이 아니라 즉시 대기의 원인을 볼 수 있습니다 NullReferenceException
또는 ArgumentNullException
미래에 또는 논리적 오류 언젠가. 일반적으로 어딘가에 검사가 as
뒤 따르지 않는 표현식 null
은 코드 냄새입니다.
반면, 캐스트에 대해 확신이없고 실패 할 것으로 예상 as
되는 경우 try-catch
블록으로 랩핑 된 일반 캐스트 대신 사용해야 합니다 . 또한 as
유형 검사 후 캐스트에 사용하는 것이 좋습니다. 대신에:
if (x is SomeType)
((SomeType)x).SomeMethod();
이는 생성 isinst
명령 에 대한 is
키워드 및 castclass
명령 캐스트 (효과적으로 두 번 캐스트를 수행)를 들어, 당신은 사용해야합니다 :
var v = x as SomeType;
if (v != null)
v.SomeMethod();
isinst
명령 만 생성합니다 . 이전의 방법은 경쟁 조건으로 인해 is
검사가 성공하고 캐스트 라인에서 실패한 후 변수의 유형이 변경 될 수 있으므로 다중 스레드 응용 프로그램에 결함이있을 수 있습니다 . 후자의 방법은이 오류가 발생하지 않습니다.
다음 솔루션은 프로덕션 코드에 사용 하지 않는 것이 좋습니다 . C #에서 이러한 기본 구성을 정말로 싫어한다면 VB 또는 다른 언어로 전환하는 것을 고려할 수 있습니다.
캐스트 구문을 필사적으로 싫어하는 경우 캐스트를 모방하는 확장 메소드를 작성할 수 있습니다.
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
깔끔한 [?] 구문을 사용하십시오.
obj.To<SomeType>().SomeMethod()