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