Chcę spróbować przekonwertować ciąg na Guid, ale nie chcę polegać na wyłapywaniu wyjątków (
- ze względu na wydajność - wyjątki są drogie
- ze względów użyteczności - pojawia się debugger
- ze względów projektowych - oczekiwany nie jest wyjątkowy
Innymi słowy kod:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
nie jest odpowiedni.
Spróbowałbym użyć RegEx, ale ponieważ GUID może być owinięty w nawiasy, owinięty nawiasami klamrowymi, żaden owinięty, utrudnia.
Dodatkowo myślałem, że niektóre wartości Guid są nieprawidłowe (?)
Aktualizacja 1
ChristianK miał dobry pomysł na złapanie FormatException
, a nie wszystkich. Zmieniono przykładowy kod pytania, aby uwzględnić sugestię.
Aktualizacja 2
Po co martwić się zgłoszonymi wyjątkami? Czy naprawdę tak często oczekuję nieprawidłowych identyfikatorów GUID?
Odpowiedź brzmi: tak . Dlatego używam TryStrToGuid - I am spodziewa złych danych.
Przykład 1 Rozszerzenia przestrzeni nazw można określić, dodając identyfikator GUID do nazwy folderu . Mogę analizować nazwy folderów, sprawdzając, czy tekst po finale . jest GUID.
c:\Program Files
c:\Program Files.old
c:\Users
c:\Users.old
c:\UserManager.{CE7F5AA5-6832-43FE-BAE1-80D14CD8F666}
c:\Windows
c:\Windows.old
Przykład 2 Być może korzystam z intensywnie używanego serwera WWW, który chce sprawdzić poprawność niektórych przesłanych danych. Nie chcę, aby nieprawidłowe dane wiązały zasoby o 2-3 rzędy wielkości wyższe, niż trzeba.
Przykład 3 Mogę analizować wyrażenie wyszukiwania wprowadzone przez użytkownika.
Jeśli wprowadzą identyfikatory GUID, chcę je przetworzyć specjalnie (na przykład wyszukiwanie konkretnego obiektu lub wyróżnienie i sformatowanie tego konkretnego wyszukiwanego terminu w tekście odpowiedzi).
Aktualizacja 3 - Testy wydajności
Przetestuj konwersję 10 000 dobrych przewodników i 10 000 złych przewodników.
Catch FormatException:
10,000 good: 63,668 ticks
10,000 bad: 6,435,609 ticks
Regex Pre-Screen with try-catch:
10,000 good: 637,633 ticks
10,000 bad: 717,894 ticks
COM Interop CLSIDFromString
10,000 good: 126,120 ticks
10,000 bad: 23,134 ticks
ps Nie powinienem uzasadniać pytania.
4.0
. Dlatego pytanie i zaakceptowana odpowiedź są takie, jakie są.