Я хочу попытаться преобразовать строку в Guid, но я не хочу полагаться на catching exceptions (
- по соображениям производительности - исключения дороги
- по причинам удобства использования - отладчик всплывает
- по соображениям дизайна - ожидаемый не является исключительным.
Другими словами, код:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
не подходит.
Я бы попытался использовать RegEx, но так как guid может быть скобкой завернутой, скобки завернуты, ни одна завернутая, затрудняет ее.
Кроме того, я думал, что некоторые значения Guid недействительны (?)
Обновление 1
ChristianK неплохо было поймать только FormatException
, а не все. Изменен образец кода вопроса, чтобы включить предложение.
Обновление 2
Зачем беспокоиться о заброшенных исключениях? Действительно ли я ожидаю, что недействительные GUID все это часто?
Ответ: да. Вот почему я использую TryStrToGuid - я am, ожидая плохих данных.
Пример 1 Расширения пространства имен можно указать, добавив GUID в имя папки. Я мог бы анализировать имена папок, проверяя, является ли текст после окончательного . 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
Пример 2 Возможно, я использую сильно используемый веб-сервер, чтобы проверить достоверность некоторых опубликованных данных. Я не хочу, чтобы недопустимые данные привязывали ресурсы на 2-3 порядка выше, чем это должно быть.
Пример 3 Я мог бы анализировать выражение поиска, введенное пользователем.
Если они вводят GUID, я хочу их обработать специально (например, специально для поиска этого объекта или выделить и форматировать этот конкретный термин поиска в тексте ответа.)
Обновление 3 - Тесты производительности
Испытайте конверсию 10 000 хороших гидов и 10 000 плохих гидов.
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. Я не должен был бы обосновывать вопрос.