代码之家  ›  专栏  ›  技术社区  ›  Jack Marchetti

.NET 3.5中是否有guid.typarse()?

  •  48
  • Jack Marchetti  · 技术社区  · 15 年前

    更新

    guid.typarse在.NET 4.0中可用

    结束更新

    显然.NET clr 2.0中没有公共的guid.typarse()。

    所以,我在研究正则表达式(也就是谷歌搜索找到一个),每次我找到一个正则表达式时,在评论部分有一个关于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.typarse()吗?

    有没有人有一个真正的正则表达式可以适用于所有的guid?

    8 回复  |  直到 7 年前
        1
  •  55
  •   JaredPar    15 年前

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

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

        2
  •  19
  •   Darin Dimitrov    15 年前

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

        3
  •  10
  •   Ahmed Mansour grenix    8 年前

    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);
    }
    
        4
  •  7
  •   Olivier Jacot-Descombes    7 年前

    此实现 TryParse 对于guid,使用try catch来捕获格式错误的guid。它是作为扩展方法实现的,必须将und放在静态类中:

    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 提供了一个 三分法 和A TryPareExact 方法。

        5
  •  5
  •   bdukes Jon Skeet    15 年前

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

        6
  •  0
  •   ynnckcmprnl    15 年前

    据我所知,目前.NET框架中没有台盼功能。您必须使用regex或try-catch选项。雷杰克斯不是我的茶,所以我相信会有人给我回复。

    例外是昂贵的性能方面,所以我的投票权到了regex选项。

        7
  •  0
  •   jheddings    15 年前

    这应该有效:

    @"^\{?[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}\}?$"
    
        8
  •  0
  •   ryber    15 年前

    您可以编写自己的typarse作为guid的扩展方法。然后当微软的“真正”出现时,你已经很好了,不用改变了。