49

更新

Guid.TryParse 在 .NET 4.0 中可用

结束更新

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

所以,我正在研究正则表达式 [又名谷歌搜索找到一个],每次我找到一个时,评论部分都会有一个激烈的争论,关于 RegEx A 不起作用,使用 RegEx B。然后有人会写 Regex C yadda雅达

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

public static bool IsGuid (string possibleGuid) {

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

显然我不是很喜欢这个,因为它从第一天起就被钻入我体内,以避免抛出异常,如果你可以围绕它进行防御性编码。

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

是否有人拥有适用于所有 GUID 的真正正则表达式?

4

8 回答 8

55

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

至于为什么没有。这些类型的问题通常很难正确回答。很可能是疏忽或时间限制问题。如果您在反射器中打开 mscorlib,您会看到实际上有一个名为 TryParse on 的方法,Guid但它是私有的。在某些情况下它也会抛出异常,所以它不是一个好的等价物 say Int32.TryParse

于 2009-11-06T16:20:22.827 回答
19

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

于 2009-11-06T16:20:57.510 回答
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);
}
于 2009-11-06T16:33:26.877 回答
9

仅适用于.NET Framework 3.5或更早版本:

这个TryParsefor Guids 的实现使用 try-catch 来捕获格式错误的 Guid。它作为扩展方法实现,并且必须放在静态类中:

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.
}

.NET Framework 4.0开始,System.Guid提供了使上述代码片段过时的方法TryParseTryPareExact

于 2013-08-02T14:23:54.937 回答
5

至于为什么没有,这是一个疏忽。Guid.TryParse.NET 4中将有一个(有关详细信息,请参阅BCL 博客文章)。

于 2009-11-06T16:20:21.177 回答
0

据我所知,.NET Framework 中没有 TryParse 功能。您将不得不求助于 RegEx 或 try-catch 选项。RegEx 不是我的最爱,所以我相信其他人会发布答案。

例外是昂贵的性能明智,所以我投票给 RegEx 选项。

于 2009-11-06T16:22:57.490 回答
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}\}?$"
于 2009-11-06T16:26:06.550 回答
0

您可以编写自己的 TryParse 作为 Guid 的扩展方法。然后,当来自 MS 的“真正的”出现时,您已经可以开始了,无需更改。

于 2009-11-06T16:26:16.763 回答