クラスライブラリのメソッドまたはプロパティを記述する必要が生じることがありますが、実際の答えがなくても失敗することは例外ではありません。何かを判断できない、利用できない、見つからない、現在不可能、または利用可能なデータがもうない。
このような比較的例外的ではない状況で、C#4の失敗を示す3つの解決策があると思います。
- そうでなければ意味のないマジック値を返します(
nullandなど-1)。 - 例外をスローします(例
KeyNotFoundException)。 - パラメータで
false実際の戻り値を返し、提供しoutます(などDictionary<,>.TryGetValue)。
質問は次のとおりです。どの例外ではない状況で例外をスローする必要がありますか?そして、私が投げてはいけない場合:パラメータ付きのメソッドを実装する上で与えられた魔法の値を返すのはいつTry*outですか?(私にはoutパラメーターが汚れているようで、適切に使用するのはより手間がかかります。)
設計ガイドライン(Try*メソッドについては何も知りません)、使いやすさ(クラスライブラリを求めて)、BCLとの整合性、読みやすさなどの事実に関する答えを探しています。
.NET Framework基本クラスライブラリでは、3つのメソッドすべてが使用されます。
- そうでなければ意味のないマジック値を返します。
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た。