왜 Resharper가 "as"를 "is"보다 선호합니까?


13

이와 같은 코드를 작성할 때 obj는 로컬 변수입니다.

if (obj is IMyInterface)
{
   var result = (IMyInterface)obj;
   // ....
}

Resharper는 다음과 같은 코드로 변경하도록 제안합니다.

var result = obj as IMyInterface;
if (result != null)
{
   // ...
}

우연한 null 참조 예외에 대한 기회를 제공하지 않기 때문에 전자를 선호합니다. 다른 형식을 선호하는 이유는 무엇입니까?

왜 Resharper가 이것을 추천합니까?

답변:


25

먼저 C #에서의 캐스팅에 대한 일반적인 질문에 대한 Jon Skeet 답변 을 살펴보십시오 .

이 작업을 수행하지 마십시오 :

if (randomObject is TargetType)
{
    TargetType foo = (TargetType) randomObject;
    // Do something with foo
}

randomObject가 로컬 변수가 아닌 필드 인 경우이 검사는 두 번뿐 아니라 다른 사항을 검사 할 수 있습니다. 다른 스레드가 둘 사이에서 randomObject의 값을 변경하면 "if"는 통과 할 수 있지만 캐스트는 실패 할 수 있습니다.

(...)

randomObject가 TargetType의 인스턴스이고 TargetType이 참조 유형 인 경우 다음과 같은 코드를 사용하십시오.

TargetType convertedRandomObject = randomObject as TargetType;
if (convertedRandomObject != null)
{
    // Do stuff with convertedRandomObject
}

그런 다음 비슷한 주제를 참조하십시오.


1
+1 주제에 대한 Eric Lippert의 블로그 게시물 도 참조하십시오 .
Brian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.