web-dev-qa-db-ja.com

.NET 3.5にはGUID.TryParse()がありますか?

[〜#〜]更新[〜#〜]

Guid.TryParseは.NET 4.0で利用可能です

更新の終了

明らかに、.NET CLR 2.0にはパブリックGUID.TryParse()はありません。

だから、私は正規表現を探していました[別名グググルして見つけます]。正規表現Aが機能しないというコメントセクションで白熱した議論が見つかるたびに、正規表現Bを使用します。その後、誰かが正規表現Cを書くでしょう。ヤッダ

とにかく、やろうと思ったのはこれでしたが、気分が悪くなりました。

public static bool IsGuid (string possibleGuid) {

    try {
      Guid gid = new Guid(possibleGuid);
      return true;    
    } catch (Exception ex) {
      return false;
    }
}

明らかに、周りに防御可能なコードを記述できる場合に例外をスローしないように、最初からドリルダウンされているので、私は本当にこれが好きではありません。

.NET FrameworkにパブリックGuid.TryParse()がない理由を誰かが知っていますか?

すべてのGUIDで機能する実際の正規表現を持っている人はいますか?

49
Jack Marchetti

CLR 2.0以前にはGuid.TryParseはありません。 CLR 4.0およびVisual Studio 2010以降で利用可能になります。

なぜなかったかについて。これらの種類の質問は、通常、正しく答えることが困難です。おそらくそれは見落としや時間の制約の問題でした。 mscorlibをリフレクターで開くと、実際にはGuidにTryParseという名前のメソッドがありますが、それはプライベートです。また、特定の場合に例外をスローするため、Int32.TryParseと言っても意味がありません。

55
JaredPar

Guid.TryParse 正規表現を使用した実装。

19
Darin Dimitrov

文字列の拡張メソッドとして実装されているIsGuid ...

public static bool IsGuid(this string stringValue)
{
   string guidPattern = @"[a-fA-F0-9]{8}(\-[a-fA-F0-9]{4}){3}\-[a-fA-F0-9]{12}";
   if(string.IsNullOrEmpty(stringValue))
     return false;
   Regex guidRegEx = new Regex(guidPattern);
   return guidRegEx.IsMatch(stringValue);
}
10

このGUIDのTryParseの実装では、誤った形式のGUIDをキャッチするために、try-catchを使用しています。拡張メソッドとして実装され、静的クラスに配置する必要があります。

public static bool TryParseGuid(this string s, out Guid guid)
{
    try {
        guid = new Guid(s);
        return true;
    } catch {
        guid = Guid.Empty;
        return false;
    }
}

それはで呼び出すことができます

string s = "{CA761232-ED42-11CE-BACD-00AA0057B223}";
Guid id;
if (s.TryParseGuid(out id) {
    // TODO: use id
} else {
    // Sorry not a valid Guid.
}

C#7.0/Visual Studio 2017以降、次のコマンドで呼び出すことができます。

string s = "{CA761232-ED42-11CE-BACD-00AA0057B223}";
if (s.TryParseGuid(out Guid id) {
    // TODO: use id
} else {
    // Sorry not a valid Guid.
}

[〜#〜]更新[〜#〜]

Visual Studio 2010/.NET Framework 4.0以降、System.GuidTryParseおよびTryPareExactメソッドを提供します。

なぜそれがないのかという点では、それは見落としです。 Guid.TryParse in .NET 4(詳細は BCLブログ投稿 を参照)。

5
bdukes

現時点では、.NET FrameworkにTryParse機能はありません。 RegExまたはtry-catchオプションを使用する必要があります。 RegExは私のお茶ではないので、誰か他の人が答えを投稿すると確信しています。

例外はパフォーマンスの面でコストがかかるため、私の投票はRegExオプションに行きます。

0

これはうまくいくはずです:

@"^\{?[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}\}?$"
0
jheddings

Guidの拡張メソッドとして独自のTryParseを作成できます。次に、MSの「本物」のものが表示されたら、あなたはもう準備ができており、変更する必要はありません。

0
ryber