¿Probar si la cadena es un guid sin lanzar excepciones?

Quiero intentar convertir una cadena a un Guid, pero no quiero confiar en la captura de excepciones (

Por razones de rendimiento, las excepciones son caras.por razones de usabilidad - el depurador aparecePor 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 como el guid puede estar envuelto en paréntesis, envuelto con corsé, sin envolver, lo hace difícil.

Además, pensé que ciertos valores de Guid no son válidos (?)

Actualización 1

ChristianK Tuve una buena idea para atrapar soloFormatException, en lugar de todo. Se modificó el ejemplo de código de la pregunta para incluir sugerencias.

Actualización 2

¿Por qué preocuparse por las excepciones lanzadas? ¿Realmente espero GUIDs inválidos con tanta frecuencia?

La respuesta essí. Es por eso que estoy usando TryStrToGuid - Ia.m esperando malos datos.

Ejemplo 1 Las extensiones del espacio de nombres se pueden especificar agregando un GUID a un nombre de carpeta. Puede que esté analizando los nombres de las carpetas, verificando si el texto 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 Es posible que esté ejecutando un servidor web muy utilizado para comprobar la validez de algunos datos publicados. No quiero que los datos no válidos acumulen recursos de 2 a 3 órdenes de magnitud más altos de lo que deben ser.

Ejemplo 3 Podría estar analizando una expresión de búsqueda introducida por un usuario.

Si ingresan los GUID, deseo 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

Prueba convirtiendo 10,000 Guids buenos, y 10,000 Guids malos.

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.

Respuestas a la pregunta(18)

Su respuesta a la pregunta