【问题标题】:Guid.Parse() or new Guid() - What's the difference?Guid.Parse() 或 new Guid() - 有什么区别?
【发布时间】:2011-10-18 11:03:54
【问题描述】:

这两种将字符串转换为System.Guid的方法有什么区别?有理由选择其中一个吗?

var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");

var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");

【问题讨论】:

  • 在什么方面?
  • 你也可以使用:Guid.TryParse()

标签: c# .net guid


【解决方案1】:

我会选择TryParse。它不会抛出异常。

【讨论】:

  • 我不认为这是一个原因。在某些情况下您需要异常,而在某些情况下您不需要。更多的是根据场景选择合适的方法。
  • +1 带有一个可能有空字符串的数据库,这是解析 guid 并在字符串为空时获取 Guid.Empty 的简单方法。
  • 我也同意@DirkVollmar 的观点,即这是一个糟糕的推理。一直使用TryParse 会导致大量问题和无效的代码路径。当您知道该值应该是 Guid 时,最好使用 Parse,如果不是,则快速失败,而不是尝试处理完全无效的场景并使您的代码更加复杂和脆弱。
【解决方案2】:

快速浏览一下反射器会发现两者几乎是等价的。

public Guid(string g)
{
    if (g == null)
    {
       throw new ArgumentNullException("g");
    }
    this = Empty;
    GuidResult result = new GuidResult();
    result.Init(GuidParseThrowStyle.All);
    if (!TryParseGuid(g, GuidStyles.Any, ref result))
    {
        throw result.GetGuidParseException();
    }
    this = result.parsedGuid;
}

public static Guid Parse(string input)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    GuidResult result = new GuidResult();
    result.Init(GuidParseThrowStyle.AllButOverflow);
    if (!TryParseGuid(input, GuidStyles.Any, ref result))
    {
        throw result.GetGuidParseException();
    }
    return result.parsedGuid;
}

【讨论】:

  • 感谢您的回复。我真的在寻找“他们的工作方式是否有所不同”。
  • 看起来使用的 GuidParseThrowStyle 有明显的不同,所以一个人可能会抛出一个错误,而另一个人不会。
  • @Triynko:如果您查看代码,您会发现它们都抛出相同的原因。唯一的区别是如果OverflowException 被抛出,它将被封装在FormatException 中,以防Guid.Parse
【解决方案3】:

使用对您来说最易读的版本。两者的实现方式几乎完全相同。

唯一真正的区别是构造函数在尝试解析之前将自己初始化为Guid.Empty。但是,有效代码是相同的。

话虽如此,如果Guid 来自用户输入,那么Guid.TryParse 将比任何一个选项都好。如果这个Guid 是硬编码的,并且始终有效,那么以上任何一个都是完全合理的选择。

【讨论】:

    【解决方案4】:

    我尝试了 100 万个 guid 的性能,但 Guid.Parse 的速度似乎微不足道。它使我的 PC 上的总创建时间相差 800 毫秒,相差 10-20 毫秒。

    public class Program
    {
        public static void Main()
        {
            const int iterations = 1000 * 1000;
            const string input = "63559BC0-1FEF-4158-968E-AE4B94974F8E";
    
            var sw = Stopwatch.StartNew();
            for (var i = 0; i < iterations; i++)
            {
                new Guid(input);
            }
            sw.Stop();
    
            Console.WriteLine("new Guid(): {0} ms", sw.ElapsedMilliseconds);
    
            sw = Stopwatch.StartNew();
            for (var i = 0; i < iterations; i++)
            {
                Guid.Parse(input);
            }
            sw.Stop();
    
            Console.WriteLine("Guid.Parse(): {0} ms", sw.ElapsedMilliseconds);
        }
    }
    

    然后输出:

    新的 Guid():804 毫秒

    Guid.Parse():791 毫秒

    【讨论】:

    • 这不是一个具有统计意义的基准。我多次运行并得到不同的结果。背景噪音掩盖了这些实现中任何可能的性能差异。
    【解决方案5】:

    在 .Net 框架 v1.1 中仅存在 1 种方式 -> var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");

    Guid.Parse 稍后可用。

    【讨论】:

    • 请提供解释和解决方案,以便用户更好地了解代码在做什么。
    猜你喜欢
    • 2018-08-02
    • 2011-11-22
    • 2019-03-20
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2018-06-04
    • 2012-12-29
    • 2011-01-17
    相关资源
    最近更新 更多