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

这两种将string转换为System.Guid方式有什么区别? 有没有理由select一个呢?

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

要么

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

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

使用最易读的版本。 两者几乎完全一样。

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

这就是说,如果Guid来自用户input,那么Guid.TryParse会比两个选项都好。 如果这个Guid是硬编码的,而且总是有效的,上面的任何一个都是完全合理的select。

我试图在一个千变万化的Guid和Guid.Parseperformance似乎是微不足道的快。 在我的个人电脑上,它创造了总计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毫秒

我会去TryParse 。 它不会抛出exception。