メソッド名が「Try」で始まる場合の意味について同僚と話し合っていました。
次の意見がありました。
公式の定義は何ですか?メソッド名の「Try」とは何ですか? これについての公式ガイドラインはありますか?
これはTryParseパターンとして知られており、Microsoftによって文書化されています。 公式の例外とパフォーマンスに関するMSDNページの説明 :
例外に関連するパフォーマンスの問題を回避するために、一般的なシナリオで例外をスローする可能性のあるメンバーのTryParseパターンを検討してください。
したがって、通常のユースケースが例外をスローする可能性があることを意味するコードがある場合(intの解析など)、TryParseパターンは意味があります。
(修正済み)エリックが示唆したように、公式のガイドラインがあります。
TrySomething
メソッドが表示されたら、それを想定しています
bool
を返しますSomething
メソッドがあり、自分で例外を処理できます。 (編集、Jesse Webbにより提案)続行する場合は、try
を使用する必要があると思います。メソッドが値を返すかどうかは関係ありません。
ケース1:正常に戻った場合は、何らかの方法で続行できます。
ケース2:返されない場合:それでも問題ありません。他の方法で進めることができます。
そして、そのメソッドの出力として何らかの値を期待する場合は、out
パラメーターを使用します。
int value
if (dictionary.TryGetValue("key", out value))
{
// Proceed in some way
}
else
{
// Proceed in some other way
}
メソッドの呼び出しによって無効な結果が生成される可能性があるという事実を明示する場合は、メソッド名に「Try」を使用する必要があります。ちなみに、.NET標準に従っているのは、例外を発生させる関数ではなく、プログラムの観点からVALID
またはNON_VALID
を返す関数です。
最後に、これはすべて、グループで使用することにした命名規則についてです。
次の場合は、メソッド名に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は、整数でない場合、実行するパフォーマンスが高くなります。
ボブおじさんは彼の本で以下の例を示しています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
メソッドの責任であるためです。
MicrosoftのTryParse
パターンは、出力パラメーターを避けるべきであるというクリーンコードガイドラインに違反しています。
C#の新しいバージョンを開発していない場合は、Microsoftのすべてのガイドラインに従う必要はありません。時々彼らは最高ではありません。