Teste se string é um guia sem gerar exceções?
Eu quero tentar converter uma string para um Guid, mas eu não quero contar com a captura de exceções (
por motivos de desempenho - as exceções são caraspor razões de usabilidade - o depurador aparecepor razões de design - o esperado não é excepcionalEm 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 colocado entre parênteses, o embrulhado, nenhum embrulhado, dificulta.
Além disso, eu pensei que certos valores Guid são inválidos (?)
Atualização 1
ChristianK teve uma boa ideia para pegar apenasFormatException
, ao invés de todos. Alterou o exemplo de código da pergunta para incluir sugestão.
Atualização 2
Por que se preocupar com exceções lançadas? Estou realmente esperando GUIDs inválidos com frequência?
A resposta ésim. É por isso que estou usando o TryStrToGuid - eusou esperando dados ruins.
Exemplo 1 Extensões de espaço para nome podem ser especificadas ao anexar um GUID a um nome de pasta. Eu poderia estar analisando nomes de pastas, verificando se o texto após o 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 Eu poderia estar executando um servidor web muito usado para verificar a validade de alguns dados de volta postados. Eu não quero que dados inválidos atinjam recursos de 2 a 3 ordens de magnitude maior do que o necessário.
Exemplo 3 Eu poderia estar analisando uma expressão de pesquisa inserida por um usuário.
Se eles inserirem GUIDs, quero processá-los especialmente (como pesquisar especificamente por esse objeto ou destacar e formatar esse termo de pesquisa específico no texto de resposta).
Atualização 3 - benchmarks de desempenho
Teste convertendo 10.000 bons Guids e 10.000 Bad Guids.
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
p.s. Eu não deveria ter que justificar uma pergunta.