.NET 3.5中有一个GUID.TryParse()吗?

UPDATE

Guid.TryParse在.NET 4.0中可用

END UPDATE

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

所以,我正在研究正则expression式(又名googling来find一个),每次我发现一个关于RegEx A的注释部分有一个激烈的争论,使用正则expression式B.然后有人会写正则expression式C yadda yadda

所以无论如何,我决定要做的是这件事,但是我感觉不好。

public static bool IsGuid (string possibleGuid) { try { Guid gid = new Guid(possibleGuid); return true; } catch (Exception ex) { return false; } } 

显然我不太喜欢这个,因为自从第一天就开始钻入我的行列,以避免抛出exception,如果你可以防守的话。

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

有没有人有一个真正的正则expression式,将适用于所有的GUID?

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

至于为什么没有。 这些types的问题通常很难正确回答。 这很可能是一个疏忽或时间限制问题。 如果你在reflection器中打开mscorlib,你会发现实际上Guid有一个名为TryParse的方法,但是它是私有的。 在某些情况下,它也会抛出一个exception,所以说Int32.TryParse并不是一个好的Int32.TryParse

使用正则expression式的Guid.TryParse实现。

IsGuid实现为string的扩展方法…

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

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

UPDATE

从Visual Studio 2010 / .NET Framework 4.0开始, System.Guid提供了一个TryParse和一个TryPareExact方法。

至于为什么没有一个,这是一个疏忽。 在.NET 4中将会有一个Guid.TryParse (详见BCL博客文章 )。

据我所知,.NET Framework中没有TryParsefunction。 你将不得不求助于RegEx或try-catch选项。 RegEx不是我的一杯茶,所以我确定别人会发表一个答案。

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

这应该工作:

 @"^\{?[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}\}?$" 

你可以写你自己的TryParse作为Guid的扩展方法。 那么当来自MS的“真正”一个出现时,你已经很好走了,不必改变。