Voglio provare a convertire una stringa in un Guid, ma non voglio fare affidamento sul rilevamento delle eccezioni (
- per motivi di prestazioni - le eccezioni sono costose
- per motivi di usabilità: viene visualizzato il debugger
- per motivi di design - l'atteso non è eccezionale
In altre parole il codice:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
non è adatto.
Vorrei provare a usare RegEx, ma poiché il guid può essere racchiuso tra parentesi, impacchettato, nessuno avvolto, lo rende difficile.
Inoltre, ho pensato che alcuni valori Guid non fossero validi (?)
Aggiornamento 1
ChristianK ha avuto una buona idea di catturare solo FormatException
, piuttosto che tutti. Modificato l'esempio di codice della domanda per includere suggerimenti.
Aggiornamento 2
Perché preoccuparsi delle eccezioni generate? Mi aspetto davvero tanto spesso GUID non validi?
La risposta è sì . È per questo che sto usando TryStrToGuid - Io sto aspettando dati errati.
Esempio 1 Le estensioni dello spazio dei nomi possono essere specificate aggiungendo un GUID a un nome di cartella . Potrei analizzare i nomi delle cartelle, controllando per vedere se il testo dopo la finale . è un 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
Esempio 2 Potrei eseguire un web server molto utilizzato che vuole verificare la validità di alcuni dati postati. Non voglio dati non validi che leghino le risorse 2-3 ordini di grandezza più alti di quanto debbano essere.
Esempio 3 Potrei analizzare un'espressione di ricerca immessa da un utente.
Se immettono i GUID, li voglio elaborare in modo speciale (come cercare specificamente quell'oggetto, oppure evidenziare e formattare quel termine di ricerca specifico nel testo della risposta).
Aggiornamento 3: benchmark delle prestazioni
Prova a convertire 10.000 buone guide e 10.000 cattive guide.
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 non avrei dovuto giustificare una domanda.
4.0
. Ecco perché la domanda e la risposta accettata sono come sono.