Guid.Parse()或new Guid()-有什么区别?


79

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

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

要么

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

6
在什么方面呢?
raym0nd 2011年

4
您也可以使用:Guid.TryParse()
Patrick Desjardins

Answers:


89

快速浏览Reflector可以发现两者几乎相等。

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

感谢您的回复。我真的在寻找“他们的工作方式有所不同”。
brennazoon

看起来所使用的GuidParseThrowStyle有明显的区别,因此一个输入可能会引发错误,而另一个则不会。
Triynko

3
@Triynko:如果您看一下代码,将会发现它们都是出于相同的原因抛出的。唯一的区别是,如果OverflowException抛出,则将FormatException在的情况下将其封装Guid.Parse
卡·克雷莫内西

25

使用最容易理解的版本。两者的实现几乎完全相同。

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

话虽如此,如果Guid是来自用户输入的,那Guid.TryParse将比这两个选项都更好。如果这Guid是硬编码且始终有效,则以上两种方法都是完全合理的选择。


13

我尝试以一百万Guid和Guid的性能进行测试.Parse似乎快了很多。它使10-20 milisecods在我的PC上的总创建时间相差800毫秒。

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毫秒


3
这不是具有统计意义的基准。我多次运行此程序,并得到了不同的结果。在这些实现中,背景噪声会掩盖任何可能的性能差异。
Brad M

1

我会同意的TryParse。它不会引发异常。


29
我不认为这是一个原因。在某些情况下,您需要例外情况,在某些情况下,您不需要例外情况。取决于方案,更多的是选择适当的方法。
德克·沃尔玛

使用可能具有空字符串的数据库+1,这是解析guid并获取Guid.Empty的简单方法(如果字符串为空)。
ashes999 2012年

我也同意@DirkVollmar的观点,这是错误的推理。TryParse长时间使用会导致大量问题和无效的代码路径。与Parse知道Guid处理一个完全无效的情况并使代码更复杂和更脆弱时相比,最好在知道该值应为a且如果不是该值时会快速失败,则使用该方法。
julealgon

-1

在.Net Framework v1.1中,仅存在一种方式-> var myguid = new Guid(“ 9546482E-887A-4CAB-A403-AD9C326FFDA5”);

Guid.Parse稍后可用。


1
请提供说明以及解决方案,以便用户更好地了解代码的作用。
安德鲁·里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.