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。