때로는 실제 답변이없는 것이 예외가 아닌 클래스 라이브러리에 대한 메소드 또는 속성을 작성 해야하는 경우가 있습니다. 확인할 수 없거나 사용할 수 없거나 찾을 수 없거나 현재 사용할 수 없거나 더 이상 사용할 수있는 데이터가 없습니다.
C # 4에서 실패를 나타내는 비교적 예외적이지 않은 상황에 대한 세 가지 가능한 솔루션이 있다고 생각합니다 .
- 다른 의미가없는 마술 값을 반환합니다 (예 :
null
및-1
). - 예외를 던지십시오 (예 :)
KeyNotFoundException
; - 되돌아
false
와의 실제 반환 값을 제공하는out
매개 변수를 (예컨대Dictionary<,>.TryGetValue
).
따라서 질문은 다음 과 같습니다. 예외가 아닌 상황에서 예외를 던져야합니까? 그리고 내가 던져서는 안되는 경우 : 언제 매개 변수 로 Try*
메소드를 구현하는 것보다 마법의 가치를 반환out
합니까? 나에게 out
매개 변수가 더러워 보이며 올바르게 사용하는 것이 더 많은 작업입니다.
디자인 지침 ( Try*
메소드 에 대해 전혀 모른다 ), 유용성 (클래스 라이브러리에 대해 요청), BCL과의 일관성 및 가독성과 같은 사실적인 답변을 찾고 있습니다.
.NET Framework 기본 클래스 라이브러리에서는 세 가지 방법이 모두 사용됩니다.
- 그렇지 않으면 의미가없는 마법의 값을 반환합니다.
Collection<T>.IndexOf
-1을 반환하고StreamReader.Read
-1을 반환하고Math.Sqrt
NaN을 반환하고Hashtable.Item
null을 돌려줍니다.
- 예외를 던지십시오 :
Dictionary<,>.Item
KeyNotFoundException을 던지고,Double.Parse
FormatException을 던집니다. 또는
- 매개 변수
false
에 실제 반환 값을 반환 하고 제공하십시오out
.
로합니다 Hashtable
C #에서 더 제네릭 없었다 시점에서 만든, 그것은 사용 object
하기 때문에 반환 할 수 있습니다 null
마법의 값으로. 그러나 제네릭의 경우 예외가에서 사용 Dictionary<,>
되며 처음에는 예외가 없었습니다 TryGetValue
. 분명히 통찰력이 바뀝니다.
물론, Item
- TryGetValue
및 Parse
- TryParse
이중성은 이유가있다, 그래서 나는 비 뛰어난 실패에 대한 예외를 던지는 C # 4에 있다고 가정 하지 . 그러나 Try*
방법이 존재하더라도 항상 존재하는 것은 아닙니다 Dictionary<,>.Item
.