2008-11-03 5 views
4

이 내가 쓴 것입니다 :C#의 NullReference 예외 및 ReSharper에서 제안

ReSharper에서 나에게 오류 (내가 ReSharper에서 새로운 오전 ... 나는 그것을 시도하고있다)을 넣어 그것은 나를 제안
if ((lstProperty[i].PropertyIdentifier as string).CompareTo("Name") == 0) 

:

if (((string) lstProperty[i].PropertyIdentifier).CompareTo("Name") == 0) 

왜 두 번째 NullException 안전합니까? 널 값이 나타나면 나에게 충돌이 일어날 것인가?

답변

8

'as'연산자는 캐스트를 실행할 수없는 경우 null을 반환하고 C 스타일의 캐스트는 전송할 수없는 경우 예외를 throw합니다.

string propertyIdentifier = lstProperty[u].PropertyIdentifier as string; 
if(propertyIdentifier != null && propertyIdentifier.CompareTo("Name") == 0) 
{ 
    ... your if statement ... 
} 

ReSharper에서 이것에 대해 불평하지 말아야하고, PropertyIdentifier가 null 여부를 문자열 인 경우도있는 NullReferenceException을받지 않습니다 :

은 여러 개의 문으로 이것을 깨는 것이 좋습니다.

+0

이것은 내가 무슨 생각입니다! 감사합니다. –

5

두 예제 모두 동일한 상황에서 성공하거나 실패하며 성공할 경우 동작은 동일합니다.

두 번째 예제가 약간 이전 (캐스트시) 오류가 발생하고보다 구체적인 예외 (InvalidCastExceptionNullReferenceException)가있는 경우 결과가 약간 다릅니다.

가장 큰 이점은 디버깅입니다. 실패하면 두 번째 예에서 첫 번째 예에서 실패한 이유에 대한 자세한 정보가 나타납니다. 특히 PropertyIdentifier가 null 대 non-string 인 경우 두 번째 경우에는 알 수 있지만 첫 번째 경우에는 알 수 없습니다.

또한 try/catch 인 경우 null 사례와 다른 코드 경로에서 string 사례를 처리 할 수 ​​있습니다. 그러나, 당신은 아마 이런 식으로 코딩해서는 안됩니다 : 당신이 있다면, 당신은 뭔가 다른 일을하고있어.

그것은 당신이 다양한 경우에 다음과 같은 코드를 단계별 경우 상황을 조명 도움이 될 수는 :

var propertyI = lstProperty[i]; 
var propertyIdentifier = propertyI.PropertyIdentifier; 

// pick one of these: 
var propertyIdentifierAsString = propertyIdentifier as string; 
var propertyIdentifierAsString = (string)propertyIdentifier; 

if (propertyIdentifierAsString.CompareTo("Name") == 0) 
+0

try/catch +1에 대한 정보 주셔서 감사합니다. –