这两种将字符串转换为的方式有什么区别System.Guid
?有理由选择一个吗?
var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");
要么
var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");
这两种将字符串转换为的方式有什么区别System.Guid
?有理由选择一个吗?
var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");
要么
var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");
Answers:
快速浏览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;
}
OverflowException
抛出,则将FormatException
在的情况下将其封装Guid.Parse
。
我尝试以一百万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毫秒
我会同意的TryParse
。它不会引发异常。
TryParse
长时间使用会导致大量问题和无效的代码路径。与Parse
知道Guid
处理一个完全无效的情况并使代码更复杂和更脆弱时相比,最好在知道该值应为a且如果不是该值时会快速失败,则使用该方法。
在.Net Framework v1.1中,仅存在一种方式-> var myguid = new Guid(“ 9546482E-887A-4CAB-A403-AD9C326FFDA5”);
Guid.Parse稍后可用。