Quiero intentar convertir una cadena en un Guid, pero no quiero confiar en la captura de excepciones (
- por motivos de rendimiento: las excepciones son caras
- por razones de usabilidad: aparece el depurador
- por razones de diseño: lo esperado no es excepcional
En otras palabras, el código:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
no es adecuado.
Intentaría usar RegEx, pero dado que el guid puede estar entre paréntesis, entre paréntesis, ninguno, lo hace difícil.
Además, pensé que ciertos valores Guid no son válidos (?)
Actualización 1
ChristianK tuvo una buena idea para atrapar solo FormatException
, en lugar de todos. Se modificó el ejemplo de código de la pregunta para incluir una sugerencia.
Actualización 2
¿Por qué preocuparse por las excepciones lanzadas? ¿Realmente espero GUID inválidos con tanta frecuencia?
La respuesta es si . Es por eso que estoy usando TryStrToGuid - Yo estoy esperando los datos erróneos.
Ejemplo 1 Las extensiones de espacio de nombres se pueden especificar agregando un GUID al nombre de una carpeta . Podría estar analizando los nombres de las carpetas, comprobando si el texto aparece después de la final . es 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
Ejemplo 2 Podría estar ejecutando un servidor web muy usado que quiere verificar la validez de algunos datos devueltos. No quiero datos no válidos que agrupen recursos de 2 a 3 órdenes de magnitud más de lo necesario.
Ejemplo 3 Podría estar analizando una expresión de búsqueda ingresada por un usuario.
Si ingresan los GUID, quiero procesarlos especialmente (como buscar específicamente ese objeto, o resaltar y formatear ese término de búsqueda específico en el texto de respuesta).
Actualización 3 - Puntos de referencia de rendimiento
Pruebe convertir 10,000 Guías buenas y 10,000 Guías malas.
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
PD: No debería tener que justificar una pregunta.
4.0
. Es por eso que la pregunta y la respuesta aceptada son como son.