文字列をGuidに変換しようとしていますが、例外のキャッチに依存したくありません(
- パフォーマンス上の理由から-例外は高価です
- 使いやすさの理由から-デバッガーがポップアップします
- 設計上の理由から-期待されることは例外ではありません
つまり、コード:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
適切ではない。
私はRegExを使用してみますが、GUIDは括弧で囲むことができるため、中かっこで囲み、何もラップしないと、困難になります。
さらに、特定のGuid値が無効であると思いました(?)
アップデート1
ChristianKは、FormatException
すべてではなく、のみをキャッチすることをお勧めしました。質問のコードサンプルを変更して提案を追加しました。
アップデート2
スローされた例外を心配する必要があるのはなぜですか?本当に頻繁に無効なGUIDを期待していますか?
答えはイエスです。私は-私はTryStrToGuidを使用していた理由です午前不良データを期待します。
例1 名前空間の拡張子は、GUIDをフォルダー名に追加することで指定できます。フォルダー名を解析して、最後のテキストの後にテキストがあるかどうかを確認している可能性があります。GUIDです。
c:\Program Files
c:\Program Files.old
c:\Users
c:\Users.old
c:\UserManager.{CE7F5AA5-6832-43FE-BAE1-80D14CD8F666}
c:\Windows
c:\Windows.old
例2使用頻度の高いWebサーバーを実行している可能性があり、ポストバックされたデータの有効性を確認する必要があります。無効なデータが必要以上に2〜3桁高いリソースを占有することを望まない。
例3ユーザーが入力した検索式を解析している可能性があります。
彼らがGUIDを入力した場合、それらを特別に処理したい(そのオブジェクトを具体的に検索する、または応答テキストでその特定の検索語を強調表示してフォーマットするなど)。
Update 3-パフォーマンスベンチマーク
10,000の良いGUIDと10,000の悪いGUIDをテスト変換します。
Catch FormatException:
10,000 good: 63,668 ticks
10,000 bad: 6,435,609 ticks
Regex Pre-Screen with try-catch:
10,000 good: 637,633 ticks
10,000 bad: 717,894 ticks
COM Interop CLSIDFromString
10,000 good: 126,120 ticks
10,000 bad: 23,134 ticks
PS私は質問を正当化する必要はありません。
4.0
。だからこそ、質問と受け入れられた答えは、彼らのやり方です。