У чому різниця між цими двома способами перетворення рядка 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");
Відповіді:
Швидкий перегляд 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викинути a, він буде інкапсульований 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);
}
}
І вихід:
новий напрям (): 804 мс
Guid.Parse (): 791 мс
Я пішов би з TryParse. Це не є винятком.
TryParseвикористання призводить до величезних проблем та неправильних шляхів коду. Бажано використовувати, Parseколи ви знаєте, що значення має бути, Guidі швидко не вдасться, якщо це не так, ніж спробувати обробити абсолютно недійсний сценарій і зробити ваш код більш складним і крихким.
У .Net framework v1.1 існує лише 1 спосіб -> var myguid = new Guid ("9546482E-887A-4CAB-A403-AD9C326FFDA5");
Guid.Parse став доступним пізніше.