解析対TryParse


111

Parse()とTryParse()の違いは何ですか?

int number = int.Parse(textBoxNumber.Text);

// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);

Try-Catchブロックのようなエラーチェックの形式はありますか?

回答:


155

Parse値を解析できない場合は例外をスローし、成功したかどうかを示すをTryParse返しますbool

TryParseそれはtry/ だけではありませんcatch-それの要点は、それが高速であるように例外なしで実装されているということです。実際、実装される可能性が最も高いParse方法は、メソッドが内部的に呼び出しTryParse、戻りの場合は例外をスローすることfalseです。

簡単に言えば、Parse値が有効であると確信している場合に使用します。それ以外の場合はを使用しますTryParse


1
「内部的にはParseメソッドがTryParseを呼び出します」ParseがいくつかのバージョンでTryParseより前に作成されていることを除きます。もちろん、コア実装をTryParseに移動することもできます...
Joel Coehoorn、

4
@ジョエル-私は彼らが実装を移動するだろうと思いましたが、私はリフレクターを見て、それらは「スロー...」と「リターンフォールス」を持っていること以外はまったく同じコードの個別の実装です。なぜ統合されないのかしら?
グレッグビーチ、

6
それについて考えると、Parseはいくつかの異なる例外をスローするため、すべてがTryParseからのブール値である場合、どの例外をスローするかがわかりません。
グレッグビーチ、

5
「値が有効であることが確実な場合は、Parseを使用してください」。「しかし、あなたはあなたが間違っている可能性を認めています」と付け加えます。完全に解析できることが100%わかっている場合は、TryParseを同じように正しく使用できます。
Jon

2
そして、「異なる例外」によって、@ GregBeechはクラスではなくメッセージを意味します。
Paul Draper

26

文字列を整数に変換できない場合は、

  • int.Parse() 例外をスローします
  • int.TryParse() falseを返します(ただし、例外はスローされません)

int.TryParse(some_method_that_throws_exception()、out int test)を使用するとどうなりますか?例外をキャッチしますか、それとも解析に関連するものだけをキャッチしますか?
Alexandru Antochi

@AlexandruAntochiコメントとして質問しないでください。これは、他の人が有用な答えから利益を得ることをほとんど不可能にします。ただし、しばらくの間価値があるようにするために、質問に対する答えは「いいえ」です。int.TryParseはまったくスローしません。メソッドが解析に失敗した場合、これはfalseの戻り値によってのみ反映されます。これは、解析が成功した場合にのみ、何かをする...(int.TryParse場合に使用することが便利になります。
ロブ・

3

TryParseメソッドを使用すると、何かが解析可能かどうかをテストできます。最初のインスタンスのように無効なintでParseを試行すると、TryParseで例外が発生し、解析が成功したかどうかを知らせるブール値が返されます。

脚注として、ほとんどのTryParseメソッドにnullを渡すと例外がスローされます。


基本型(int、double、DateTimeなど)にnullを渡しても例外はスローされません
Yunke博士、

3

TryParseと例外税

文字列から指定されたデータ型への変換が失敗すると、Parseは例外をスローしますが、TryParseは明示的に例外をスローしません。


ほとんどの統合TryParseメソッドにnullを渡すと、TryParseは例外をスローします。
レイブイセン2009年

1
素晴らしいリンク。「どちらが最適か、どのコーディング手法を適用すべきか」という議論をまだ誰も開始していないことに驚きます。
クリスチャンマドセン

0

TryParseは値を返さず、解析が成功したかどうかを示すステータスコードを返します(例外をスローしません)。


6
TryParseは、outキーワードで指定されたパラメーター2を通じて値を返します。
Christian Madsen

0

記録のために、私は2つのコードをテストしています。それは単に文字列から数値への変換を試み、失敗した場合は数値をゼロに割り当てます。

        if (!Int32.TryParse(txt,out tmpint)) {
            tmpint = 0;
        }

そして:

        try {
            tmpint = Convert.ToInt32(txt);
        } catch (Exception) {
            tmpint = 0;
        }

C#の場合、try&Catch代替が例外をスローするため、tryparseを使用するのが最良のオプション

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll

それは苦痛で遅く、望ましくないことですが、デバッグの例外がそれで停止するように解決されない限り、コードは停止しません。


文字列がintとして解析できない場合、tmpintはすでにゼロに設定されているため、最初のコードスニペットは何もしません。
Andrew Neely

0

私はそれが非常に古い投稿であることを知っていますが、ParseとTryParseの詳細をいくつか共有することを考えました。

DateTimeを文字列に変換する必要があるシナリオがあり、datevalueがnullまたはstring.emptyの場合、例外が発生していました。これを克服するために、ParseをTryParseに置き換え、デフォルトの日付を取得します。

古いコード:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");

新しいコード:

DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);

別の変数を宣言して、Out for TryParseとして使用する必要があります。


あなたは初期化する必要はありませんstartDateし、endDateとしてDateTime.TryParse常にでそれらを上書きしますDateTime.MinValue。誤った日付表現を別の値に変換する必要がある場合は、の戻り値を確認し、DateTime.TryParseそれがfalseの場合は、値を明示的に設定してください。
Palec

使用DateTime?DateTime nullable
Kiquenet

-1

double.Parse( "-"); double.TryParse( "-"、out parsed);の間に例外を発生させます。は0に解析されるので、TryParseはより複雑な変換を行うと思います。


4
しかしんTryParse返しますtruefalse?それが「有効」かどうかを知る方法です。
Paul Draper
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.