Guid.Parse() или новый Guid() - Какая разница?
В чем разница между этими двумя способами преобразования строки в System.Guid
? Есть ли причина выбора одного над другим?
var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");
или
var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");
Ответы
Ответ 1
Быстрый взгляд в рефлекторе показывает, что оба они в значительной степени эквивалентны.
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;
}
Ответ 2
Используйте наиболее читаемую версию. Эти два реализованы почти точно так же.
Единственное реальное отличие состоит в том, что конструктор инициализируется до Guid.Empty
перед попыткой разбора. Однако эффективный код идентичен.
При этом, если Guid
поступает с пользовательского ввода, то Guid.TryParse
будет лучше, чем любая опция. Если этот Guid
жестко закодирован и всегда действителен, любой из вышеперечисленных вариантов является вполне разумным.
Ответ 3
Я пробовал работу над одним миллионом, и Guid.Parse кажется незначительным быстрее. Это сделало 10-20 milisecods разницей 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 мс
Ответ 4
Я бы пошел с TryParse
. Это не исключение.