2012-04-01 3 views
0

저는 항상 캐스팅을 피해야한다는 생각에 빠져 있습니다. 물론 실제 선택의 여지가없는 경우가 있습니다 (특히 여러 인터페이스가 지원되는 경우 인터페이스 유형간에 변환해야하는 경우).Null 허용 유형으로 캐스팅하는 것이 나쁜 생각입니까?

나 자신이 최근에 많은 것을 사용하는 것을 보아온 한 패턴은 Null을 허용하지 않는 타입에서 Null을 허용하는 타입으로 캐스팅하는 것입니다. 예 :

public int? GetFooBar(someCriteria) { 
    // Code to get a Foo 
    return foo == null ? null : (int?)foo.Bar; // Bar is a non-null int 
} 

여기가 유일한 선택입니까? 내가 가질 수있는 다른 옵션은 무엇입니까?

나는 예외를 던질 수 있다고 가정하지만, 필요하지 않은 예외 처리기로 내 코드를 차분하게하는 것은 싫다. 게다가, foo를 찾지 못하는 것은 예상 된 발생 일 수 있으며 "예외적 인"것으로 간주되지 않습니다. 당신은 항상 할 수

+2

내게 잘 어울린다 –

+0

나는 보통 'null'을 캐스팅하는 것을 선호한다. – Mehrdad

+0

또한 bar의 기본값을 정적 멤버로 정의 할 수 있습니다. –

답변

4

: 간결의 비용

if(foo == null) 
    return null; 

return foo.Bar; 

관련 없음 캐스팅과 약간의 명확. 정말 문제예요 있도록

+0

물론입니다. 항상 옵션입니다. –

+0

더 생각하면할수록 이것이 올바른 방법이라고 생각합니다. 간결 함을 지키라. –

+0

실제로 저에게 더 간결한 느낌입니다. 나는 단순히 문자 수에 의한 간결성 만 측정하는 것이 아닙니다.이 경우 문자가 모두 내 뇌 속으로 들어가는 데 걸리는 시간입니다. – sblom

0

것은, 나 그냥 문이 같은 옵 코드로 컴파일 할 수있는 경우

return foo == null ? null : (int?)foo.Bar; 

return foo == null ? new Nullable<int>() : new Nullable<int>(foo.Bar); 

과 같은 연산 코드에와 버전을 컴파일 지적하자 개인적인 취향의. 이 버전은 어떻습니까?

return foo == null ? (int?)null : foo.Bar; 

같은 것이 있습니다. 조건부 연산자의 두 번째 또는 세 번째 피연산자에서 nullable 부분을 지적해야합니다.

관련 문제