.NET 3.5中是否有GUID.TryParse()?

时间:2009-11-06 16:17:39

标签: c# asp.net guid tryparse

更新

Guid.TryParse在.NET 4.0中可用

END UPDATE

显然,.NET CLR 2.0中没有公共GUID.TryParse()。

所以,我正在查看正则表达式[也称为google搜索一个],每次我发现其中有一个激烈的争论在评论部分关于RegEx A不起作用,使用RegEx B.然后有人会写Regex C yadda yadda

所以无论如何,我决定做的就是这个,但我对它感到很难过。

public static bool IsGuid (string possibleGuid) {

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

显然我并不喜欢这个,因为从第一天开始我就已经钻了这个,以避免抛出异常,如果你可以防范它的代码。

有谁知道为什么.NET Framework中没有公共的Guid.TryParse()?

有没有人有一个适用于所有GUID的真实正则表达式?

8 个答案:

答案 0 :(得分:55)

CLR 2.0及更早版本中没有Guid.TryParse。它将从CLR 4.0和Visual Studio 2010开始提供。

至于为什么没有。这些类型的问题通常很难正确回答。最有可能的是疏忽或时间限制问题。如果你在反射器中打开mscorlib,你会发现在Guid上实际上有一个名为TryParse的方法,但它是私有的。它在某些情况下也会引发异常,因此它与Int32.TryParse不同。

答案 1 :(得分:19)

Guid.TryParse使用正则表达式实现。

答案 2 :(得分:10)

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);
}

答案 3 :(得分:7)

Guids的TryParse实现使用try-catch来捕获畸形Guids。它作为扩展方法实现,必须放在静态类中:

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.Guid提供了TryParseTryPareExact方法。

答案 4 :(得分:5)

就没有人的原因而言,这是一种疏忽。 .NET 4中将有一个Guid.TryParse(有关详细信息,请参阅BCL blog post。)

答案 5 :(得分:0)

目前我不知道.NET Framework中没有TryParse功能。您将不得不求助于RegEx或try-catch选项。 RegEx不是我的一杯茶,所以我相信别人会发一个答案。

例外情况是性价比很高,所以我的投票会转到RegEx选项。

答案 6 :(得分: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}\}?$"

答案 7 :(得分:0)

您可以编写自己的TryParse作为Guid的扩展方法。然后,当来自MS的“真实”出现时,你已经很好,不必改变。