2011-08-02 15 views
49

Jaka jest różnica między tymi dwoma sposobami konwersji ciągu znaków na System.Guid? Czy jest jakiś powód, aby wybrać jeden z drugiego?Guid.Parse() lub nowy Guid() - Jaka jest różnica?

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

lub

var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5"); 
+6

pod względem czego? – raym0nd

+3

Można również użyć: Guid.TryParse() –

Odpowiedz

62

Szybki rzut w reflektorze pokazuje, że oba są w dużym stopniu równoważne.

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

Dzięki za odpowiedź. Naprawdę szukałem "jest różnica w ich działaniu". – brennazoon

+0

Wygląda na to, że istnieje wyraźna różnica w użytym GuidParseThrowStyle, więc można rzucić błąd na wejście, którego drugi nie będzie. – Triynko

+0

@Triynko: Jeśli spojrzysz na kod, zobaczysz, że obaj rzucają z tych samych przyczyn. Jedyna różnica polega na tym, że jeśli zostanie zgłoszony wyjątek "OverflowException", zostanie on umieszczony w 'FormatException' w przypadku' Guid.Parse'. –

4

pójdę z TryParse. Nie rzuca wyjątku.

+20

Nie uważam tego za powód jako taki. Istnieją sytuacje, w których chcesz wyjątek i scenariusze, w których nie. To bardziej kwestia wyboru odpowiedniej metody w zależności od scenariusza. –

+0

+1 z db, który może mieć pusty ciąg, jest to łatwy sposób, aby przeanalizować GUID i uzyskać Guid.Empty jeśli ciąg jest pusty. – ashes999

18

Użyj wersji, która jest dla Ciebie najbardziej czytelna. Oba są wdrażane prawie dokładnie w ten sam sposób.

Jedyną różnicą jest to, że konstruktor inicjuje się przed Guid.Empty przed próbą analizy. Jednak efektywny kod jest identyczny.

Mimo to, jeśli Guid pochodzi z danych wprowadzonych przez użytkownika, wówczas Guid.TryParse będzie lepsza niż którakolwiek z opcji. Jeśli ten Guid jest zakodowany i zawsze ważny, każda z powyższych opcji jest całkowicie uzasadniona.

9

Próbowałem wydajności na jednym milion guid i Guid.Parse wydaje się być nieznacznie szybszy. Zrobiło to 10-20 milisekund na różnicę 800 milisekund całkowitego tworzenia na moim komputerze.

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

i wyjściowych:

nowego identyfikatora GUID(): 804 ms

Guid.Parse(): 791 ms

Powiązane problemy