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