У чому різниця між цими двома способами перетворення рядка 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 став доступним пізніше.