2017-12-06 72 views
0

출력이 DBNull인지 확인하고 제네릭 형식이 Null 인 경우 null을 반환합니다. 그렇지 않으면 단순히 오류가 발생합니다. 제네릭 형식이 nullable 인 경우 null을 반환합니다.

업데이트

: 모든 권고를
public T Get<T>(string key) 
{ 
    int ordinal = reader.GetOrdinal(key); 
    if (reader.IsDBNull(ordinal)) 
    { 
     if (typeof(T).GetTypeInfo().IsValueType && Nullable.GetUnderlyingType(typeof(T)) == null) // isn't a nullable field 
      throw new InvalidCastException(); 
     else return default(T); 
    } 
    return reader.GetFieldValue<T>(ordinal); 
} 

나는 모든 널 (NULL) 필드에 null이 아닌 확인 default(T) 경우 반환 오전 그러나

을 추가했다. 이제 null을 반환하게하는 다른 방법이 있다면?

+2

'reader.GetFieldType (key)'가 보통'DBNull'을 반환하는지 확실하지 않습니다 - 작동합니까? 그 열이 null이 아닌 경우 보유 할 수있는 것을 나타내는 무언가를 반환 할 것으로 * * 기대합니다. * –

+0

제안 (Marc의 응답/설명에 추가)과 마찬가지로'if' 문을 반전합니다. * null,'return ...;'), 그리고 그냥'throw ...;에 대한'else's를 버리십시오. –

답변

5

예, default(T)는 잘 작동합니다 그래서 무엇을, 실제로 SomeType?/Nullable<SomeType>있는 모든 T에 대한 null -like 값의 오른쪽 종류이다.

당신은 비록 stringbyte[] 같은 것들을 고려하는 것이 좋습니다 - 이러한 가 데이터베이스에서 올 수와 널 (null)이 될 수 있습니다.

누군가가 실수로 실수를 저질렀는지 생각해보고 값이 <decimal> 인 경우 <int>을 묻는 것이 좋습니다. 그럴 경우 InvalidCastException이됩니다. 예외를 사용하는 것보다 더 적절할 수있는 IDataReaderIsDBNull() 메서드가 있습니다.

마지막 : 잡기 예외가 매우 비싼 작업이다 처리, 컴퓨터 자원의 측면에서 throw;

+1

[ "throw"와 "throw ex"의 차이점은 무엇입니까?] (https : //stackoverflow.com/a/730255/209259). –

+0

@ShaiCohen 내 의견에 그 질문에 Marc의 답변을 연결했습니다. 그것은 나를위한 것이 아니 었습니다 :) –

2

throw e;하는 것을 선호합니다. 귀하의 방법은 논리 흐름의 일부로 예외를 사용하고 있습니다. 이것은 당신이 해결하고자하는 문제를 보는 잘못된 방법입니다.

또한 특별히 InvalidCastException 예외를 포착합니다. 이 예외는 null 참조를 형 변환하는 것 이외의 다른 경우에 발생할 수 있습니다. 잠재적으로 유효한 오류를 숨기거나 잘못 전달하고 있습니다. 좌절감을주고 머리를 잡아 당기는 디버깅에 많은 시간을 소비 할 수있는 무언가가 있습니다.

다음은 원래의 방법과 동일한 동작을 제공해야하지만 통합 된 오류 처리 중에 스택을 푸는 오버 헤드가 없습니다.

public T Get<T>(string key) 
{ 
    if(reader.IsDbNull(reader.GetOrdinal(key))) 
    { 
     //IF YOU SPECIFICALLY WANT TO THROW AN ERROR IF A VALUE TYPE 
     //if (typeof(T).IsValueType) 
     //{ throw new InvalidCastException(); } 
     return default(T); 
    } 

    return reader.GetFieldValue<T>(reader.GetOrdinal(key)); 
}