文字列を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
ChristianKFormatException
は、すべてではなく、のみをキャッチすることをお勧めしました。質問のコードサンプルを変更して、提案を含めました。
アップデート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を入力した場合、それらを特別に処理したいと思います(たとえば、そのオブジェクトを具体的に検索したり、応答テキストでその特定の検索語を強調表示してフォーマットしたりします)。
アップデート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質問を正当化する必要はありません。