2017-12-17 28 views
0

클래스가 key와 index 인 사전이 있고 아이템이 존재하면 그 아이템을 반환하고 그렇지 않으면 null을 반환한다고 가정합니다. 다음 중 어느 것이 더 효율적입니까?키가 존재하는지 검사하는 것보다 KeyNotFoundException을 잡는 것이 더 효율적입니까?

if(myDictionary.ContainsKey(myKey)) 
    return myDictionary[myKey]; 
return null; 

또는

try { return myDictionary[myKey]; } 
catch { return null; } 
+2

짐작할 수 있겠지만 스택을 푸는 것은 해시 조회보다 비용이 많이 듭니다. 알아낼 수있는 유일한 방법이 있습니다! –

+4

'if (myDict.TryGetValue (k, out v)) '와 같이'TryGetValue'를 항상 사용할 수 있습니다. else null; – dcg

+3

예외를 피할 수있는 방법이 있으면 그것을 사용하십시오. – Steve

답변

3

효율은 소프트웨어 개발에서 고려되어야 할 문제이지만, 그것은 유일한 아니다. 성능 요건이나 임베디드 또는 모바일 장치의 배터리 절약과 같은 몇 가지 제한 사항이 없으면 일반적으로 다른 비 기능 요구 사항이 먼저 발생합니다. 유지 보수성 (코드의 이해 가능성)은 일반적으로 우선 순위가 높습니다.

그런 점을 고려하면 하나의 옵션으로 제한해서는 안됩니다. 값이 사전에없는 경우 오류가 아닌 경우 TryGet을 사용하십시오. 누락 된 값을 오류라고 생각하면 인덱서를 사용하십시오.

실제 구현을 위해 the reference source을 검사 할 때 인덱서와 TryGet은 모두 FindEntry에서 값을 가져옵니다. TryGet은 기본값 (cheap)을 획득하고 리턴합니다. 인덱서는 반환하지 않지만 또한은 예외를 throw합니다. 그것은 그것을 더 비싸게 만듭니다.