メソッド名が「Try」で始まる場合の意味について、同僚と話し合っていました。
以下の意見がありました:
- メソッドがnull値を返す可能性がある場合は、「試行」を使用します。
- メソッドが例外をスローしない場合は、「試行」を使用します。
公式の定義は何ですか?メソッド名で「試してみる」とは何ですか?これに関する公式のガイドラインはありますか?
メソッド名が「Try」で始まる場合の意味について、同僚と話し合っていました。
以下の意見がありました:
公式の定義は何ですか?メソッド名で「試してみる」とは何ですか?これに関する公式のガイドラインはありますか?
回答:
これは、TryParseパターンと呼ばれ、Microsoftによって文書化されています。公式の例外とパフォーマンスMSDNページは言います:
例外に関連するパフォーマンスの問題を回避するために、一般的なシナリオで例外をスローする可能性があるメンバーのTryParseパターンを検討してください。
したがって、通常のユースケースで例外がスローされる可能性がある(intの解析など)コードがある場合、TryParseパターンは理にかなっています。
(修正)エリックが示唆したように、公式のガイドラインがあります。
TrySomething
方法を見たらそれとする
bool
Something
例外を自分で処理できるメソッドが存在します。(編集、Jesse Webbにより提案)TryFoo
メソッドがある場合、Foo
自分で ``例外を処理できる同様のメソッドがあります。これらのメソッドのシグネチャは異なる可能性が高いため、他のコードを変更しない限り、その使用法は交換できません。
次のtry
場合は、必ずメソッド名に含めてください。
bool TrySomething(input, out yourReturn)
つまり、基本的にtry
-methods を使用すると、ブール値の結果のみが返されます。
したがって、次のコードは例外をスローしません。
string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}
一方、このコードは例外をスローできます(この場合はスローされます)。
string input = "blabla";
int number;
try
{
number = int.Parse(input); //throws an exception
}
catch (Exception)
{
//dooh!
}
Tryメソッドを使用すると、より安全で防御的な方法でコーディングできます。また、コードスニペット#2は、整数ではない場合、実行にパフォーマンスがかかります。
int number = int.Parse(input);
このコンテキストでより意味を持たせたい場合は、コードスニペット#2を読む必要があります。
int number;
tryブロックとnumber = ...
割り当ての前の宣言がまだありません。
TryLoadFile(path, out file)
RAMの外で実行されている直接動作と多少関係がない場合でも、例外をスローする可能性があることに注意してください。そのため、呼び出し側は、不正なパスやアクセスが拒否されてもエラーは発生しないと予想しますが、異常が発生する可能性のある異常なものについては例外です。そしてそれを文書化します。
ボブおじさんは、彼の本「Clean Code」で以下の例を挙げています。例外がスローされることが予想される場合は常にTry
、メソッド名にプレフィックスを使用できます。
public void sendShutDown()
{
try{
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
そして(適応):
private void tryToShutDown()
{
//some code with no error handling, but
//something might go wrong here
}
これはtryToShutDown
メソッドの責任であるため、メソッドはエラー処理を行いませんsendShutDown
。
TryParse
Microsoft のパターンは、出力パラメーターを回避する必要があると明記された明確なコードガイドラインに違反しています。
C#の新しいバージョンを開発していない場合、Microsoftのガイドラインすべてに固執する必要はありません。時には彼らは最高ではありません。