web-dev-qa-db-ja.com

「Try」がC#メソッド名で使用されるのはいつですか?

メソッド名が「Try」で始まる場合の意味について同僚と話し合っていました。

次の意見がありました。

  • メソッドがnull値を返すことができる場合は、「Try」を使用します。
  • メソッドが例外をスローしない場合は、「Try」を使用します。

公式の定義は何ですか?メソッド名の「Try」とは何ですか? これについての公式ガイドラインはありますか?

170
ms007

これはTryParseパターンとして知られており、Microsoftによって文書化されています。 公式の例外とパフォーマンスに関するMSDNページの説明

例外に関連するパフォーマンスの問題を回避するために、一般的なシナリオで例外をスローする可能性のあるメンバーのTryParseパターンを検討してください。

したがって、通常のユースケースが例外をスローする可能性があることを意味するコードがある場合(intの解析など)、TryParseパターンは意味があります。

145
Erik Schierboom

(修正済み)エリックが示唆したように、公式のガイドラインがあります。

TrySomethingメソッドが表示されたら、それを想定しています

  • 投げない
  • boolを返します
  • 値が必要な場合は、「out」パラメーターを介して返されます
  • Somethingメソッドがあり、自分で例外を処理できます。 (編集、Jesse Webbにより提案)
116
nothrow

続行する場合は、tryを使用する必要があると思います。メソッドが値を返すかどうかは関係ありません。

ケース1:正常に戻った場合は、何らかの方法で続行できます。

ケース2:返されない場合:それでも問題ありません。他の方法で進めることができます。

そして、そのメソッドの出力として何らかの値を期待する場合は、outパラメーターを使用します。

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}
7
Ashok Damani

メソッドの呼び出しによって無効な結果が生成される可能性があるという事実を明示する場合は、メソッド名に「Try」を使用する必要があります。ちなみに、.NET標準に従っているのは、例外を発生させる関数ではなく、プログラムの観点からVALIDまたはNON_VALIDを返す関数です。

最後に、これはすべて、グループで使用することにした命名規則についてです。

6
Tigran

次の場合は、メソッド名に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は、整数でない場合、実行するパフォーマンスが高くなります。

5
Fabian Bigler

ボブおじさんは彼の本で以下の例を示しています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のすべてのガイドラインに従う必要はありません。時々彼らは最高ではありません。

0
Glauber