web-dev-qa-db-ja.com

すべてのTryParseオーバーロードにoutパラメーターがあるのはなぜですか?

TryParseメソッドのoutパラメーターは必要ないことが何度もありますが、それは必然的な問題です。ここでは、不要な場合の例を示します。

文字列が整数かどうかを確認したいのですが、整数の場合は「整数」と出力します。それ以外の場合は、「整数ではありません」と出力します。コードは次のとおりです。

string value = Console.ReadLine(); //Get a value from the user.
int num; //Why should I have it?? No need at all !

if (int.TryParse(value, out num))
{
    Console.WriteLine("An integer");
}
else
{
    Console.WriteLine("Not an integer");
}

TryParseが常に出力パラメーターを返す理由を疑問に思っていますか?なぜ出力パラメータなしでオーバーロードを持たないのですか?

36
Misha Zaslavsky

更新された回答:

C#の最近のバージョンでは、出力パラメーターをインラインで宣言できます。これにより、例で不要なコード行を削除できます。

_string value = Console.ReadLine(); //Get a value from the user.

if (int.TryParse(value, out int num))
{
    Console.WriteLine("An integer");
}
else
{
    Console.WriteLine("Not an integer");
}
_

コード内の結果を単に無視して、余分な行を持たないようにすることができます。まだ余分なパラメーターがありますが、そうですか?

基礎となる「理由」は依然として同じであり、変更されることはほとんどありません。メソッドは、成功を示すboolと、成功した場合に結果の値を示すintの2つのものを返す必要がありました。 (結果を伝える別の方法を考えることはできませんか?)メソッドは1つのものしか返すことができず、カスタム結果タイプはこれに対してやり過ぎのように見えるので、boolを返し、結果を得ることが決定されましたoutパラメーターである。そして、その決定が下された後、それは言語の期間中維持されなければなりません。

「それら」は確かにcouldint値に出力されないオーバーロードを追加します。しかし、なぜ?設計、文書化、テスト、そしてこれまで見てきたようにperpetually目的を果たさないメソッドをサポートするだけでなく、ごく少数の開発者のためにいくつかのキーストロークを節約するのに努力するのはなぜですか?繰り返しますが、非常に可能性は低いです。

そのような機能については、 変更を提案する を歓迎します。提案を受け入れてもらうのはかなりクールだと思います。私はこれがそうだとは思わないが、もしあなたがそれについて情熱を持っているなら、どうしてもそれを持っている。


元の回答:

簡単な答えは、「それがメソッドの定義方法だから」です。おそらく偶然に、C#言語チームの誰かがこの質問を見つけてwhyの決定が下されたことに推論を提供するかもしれませんが、それは現時点ではあまり変わりません。 C#は静的にコンパイルされた言語であり、メソッドシグネチャを一致させる必要があるため、そのままです。

(彼らがこれを変更し、既存のすべてのコードベースで.TryParse()を壊したと想像してください。それは...悪いことです。)

ただし、独自のコードでこれを回避できる場合があります。拡張メソッドのような単純なものがあなたのためのトリックを行うことができます:

_public static bool IsInt(this string s)
{
    int x = 0;
    return int.TryParse(s, out x);
}
_

次に、コード内で文字列値からそのメソッドを呼び出すだけです。

_string value = Console.ReadLine();
if (value.IsInt())
    Console.WriteLine("An integer");
else
    Console.WriteLine("Not an integer");
_
31
David

TryParseは、intstring表現を決定するための比較的複雑な操作です。 boolを返すだけのオーバーロードがある場合、多くの(経験のない)開発者がこの非効率的なパターンに従う可能性が非常に高くなります。

int myInt = -1;
if(int.TryParse("123"))
    myInt = int.Parse("123");
5
Tim Schmelter

TryParseにoutパラメーターがあるのはなぜですか?
TryParseの実装方法の非常に単純な理由のため。
何かが解析可能かどうかを判断する方法は、解析することです!何かを解析できる場合、解析可能です。解析できない場合、解析できません。

したがって、何かが解析可能かどうかを判断する方法として、それがis解析可能であれば、すでに解析済みです!この解析された値を破棄するのは愚かなことです(解析可能なものがあるかどうか疑問に思っている人は誰でも解析結果に関心がある可能性が高い)ので、解析された値が返されます。

解析された値は、True-Returning TryParse呼び出しの副産物であるため、出力パラメーターがあります。

3
Task