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

时间:2011-08-02 17:24:00

标签: c# .net guid

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

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

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

5 个答案:

答案 0 :(得分:76)

快速浏览反射器可以发现两者几乎相同。

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

答案 1 :(得分:23)

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

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

话虽如此,如果Guid来自用户输入,则Guid.TryParse将优于任一选项。如果此Guid是硬编码的,并且始终有效,则上述任何一种都是完全合理的选项。

答案 2 :(得分:11)

我尝试了一个百万的guid和Guid.Parse的表现似乎是一个微不足道的速度。它在我的电脑上产生了10-20毫秒的差异,总共创造了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 ms

Guid.Parse():791 ms

答案 3 :(得分:1)

我会选择TryParse。它没有抛出异常。

答案 4 :(得分:-1)

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

Guid.Parse稍后可用。