将这两种字符串转换为System.Guid
的方法有何区别?是否有理由选择其中一个?
var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");
或
var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");
答案 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稍后可用。