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

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

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

或者

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

A quick look in the Reflector reveals that both are pretty much equivalent.

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

Use the version that is the most readable to you. The two are implemented almost exactly the same way.

The only real difference is that the constructor initializes itself to Guid.Empty before attempting the parse. However, the effective code is identical.

That being said, if the Guid is coming from user input, then Guid.TryParse would be better than either option. If this Guid is hard coded, and always valid, either of the above are perfectly reasonable options.

I tried performance on one milion guids and Guid.Parse seems to be a insignificantly faster. It made 10-20 milisecods difference of 800 miliseconds of total creation on my PC.

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

And output:

new Guid(): 804 ms

Guid.Parse(): 791 ms

In .Net framework v1.1 exists only 1 way -> var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");

Guid.Parse became available later.