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