Quero tentar converter uma string em um Guid, mas não quero depender de exceções de captura (
- por razões de desempenho - as exceções são caras
- por motivos de usabilidade - o depurador é exibido
- por motivos de design - o esperado não é excepcional
Em outras palavras, o 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;
}
}
Não é adequado.
Eu tentaria usar o RegEx, mas como o guid pode ser empacotado entre parênteses, empacotado entre chaves, nenhum empacotado, fica difícil.
Além disso, pensei que certos valores de Guid são inválidos (?)
Atualização 1
ChristianK teve uma boa idéia para capturar apenas FormatException
, e não todos. O exemplo de código da pergunta foi alterado para incluir sugestão.
Atualização 2
Por que se preocupar com exceções lançadas? Estou realmente esperando GUIDs inválidos com tanta frequência?
A resposta é sim . É por isso que estou usando o TryStrToGuid - estou esperando dados ruins.
Exemplo 1 As extensões de espaço para nome podem ser especificadas anexando um GUID a um nome de pasta . Talvez eu esteja analisando os nomes das pastas, verificando se o texto após a final . é um 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
Exemplo 2 Talvez eu esteja executando um servidor da Web muito usado e queira verificar a validade de alguns dados publicados de volta. Não quero que dados inválidos vinculem recursos de 2 a 3 ordens de magnitude maiores do que precisam.
Exemplo 3 Talvez eu esteja analisando uma expressão de pesquisa inserida por um usuário.
Se eles digitarem GUIDs, desejo processá-los especialmente (como pesquisar especificamente por esse objeto ou realçar e formatar esse termo de pesquisa específico no texto de resposta).
Atualização 3 - Benchmarks de desempenho
Teste a conversão de 10.000 Guids bons e 10.000 Guids ruins.
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 Eu não deveria ter que justificar uma pergunta.
4.0
. É por isso que a pergunta e a resposta aceita são do jeito que são.