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

7fyelxc5  于 2023-01-27  发布在  .NET
关注(0)|答案(8)|浏览(161)
    • 更新**

Guid.TryParse在. NET 4.0中可用

    • 结束更新**

显然,在. NET CLR 2.0中没有公共GUID. TryParse()。
所以,我一直在寻找正则表达式[也就是在谷歌上搜索一个],每次我找到一个正则表达式时,评论区都会有一场激烈的争论,说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框架中没有公共Guid.TryParse()吗?
有没有人有一个真正的正则表达式,将工作的所有GUID?

mnemlml8

mnemlml81#

CLR 2.0及更早版本中没有Guid.TryParse。从CLR 4.0和Visual Studio 2010开始,它将可用。
至于为什么没有。这类问题通常很难正确回答。最有可能是疏忽或时间限制问题。如果你在reflector中打开mscorlib,你会看到Guid上实际上有一个名为TryParse的方法,但它是私有的。它在某些情况下也会抛出异常,所以它不是一个很好的等价物。

oogrdqng

oogrdqng2#

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

xsuvu9jc

xsuvu9jc3#

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

lnvxswe24#

仅适用于**.NET Framework 3.5**或更早版本:
TryParse的Guid实现使用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方法,使上述代码片段过时。

dldeef67

dldeef675#

至于为什么没有Guid.TryParse,这是一个疏忽,在.NET 4中会有Guid.TryParse(详细信息请参见BCL blog post)。

hxzsmxv2

hxzsmxv26#

据我所知,目前.NET Framework中还没有TryParse功能。您必须求助于RegEx或try-catch选项。RegEx不是我的菜,所以我相信其他人会发布答案。
异常在性能方面代价很高,所以我投票支持RegEx选项。

bfnvny8b

bfnvny8b7#

这应该行得通:

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

pnwntuvh8#

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

相关问题