45

私は、TryParse メソッドの out パラメーターを必要としないことが多いことを発見しましたが、それが必然であるという問題があります。ここでは、不要な場合の例を 1 つ示します。

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

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 が常に out パラメータを返すのはなぜですか? out パラメータなしでオーバーロードがないのはなぜですか?

4

4 に答える 4

43

更新された回答:

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パラメータ。そして、その決定が下されたら、それは言語の存続期間中維持されなければなりません。

「彼ら」は確かに、値に出力されないオーバーロードを追加できintます。しかし、なぜ?設計、文書化、テストに労力を費やす必要はありません。また、非常に少数の開発者のキーストロークを節約する以外に何の目的も持たないメソッドを永続的にサポートするのはなぜでしょうか? 繰り返しますが、非常にありそうにありません。

このような機能については、変更の提案を歓迎します。提案が受け入れられるのはかなりクールだと思います。これがそうであるとは思えませんが、あなたがそれに情熱を注いでいるなら、ぜひ試してみてください.


元の回答:

簡単に言えば、「メソッドがそのように定義されているため」です。たまたま、C# 言語チームの誰かがこの質問を見つけて、決定が下された理由を説明するかもしれませんが、現時点ではあまり変わりません。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");
于 2013-10-25T14:13:49.333 に答える
6

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

int myInt = -1;
if(int.TryParse("123"))
    myInt = int.Parse("123");
于 2013-10-25T14:12:17.453 に答える
2

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

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

解析された値は true を返す TryParse 呼び出しの副産物であるため、out パラメーターがあります。

于 2013-10-25T14:26:45.930 に答える