Я хочу попробовать преобразовать строку в Guid, но я не хочу полагаться на перехват исключений (
- по соображениям производительности - исключения дорогие
- по соображениям удобства использования - появляется отладчик
- по проектным причинам - ожидаемое не исключение
Другими словами код:
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 - я * ожидаю неверных данных.
Пример 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. Я не должен был обосновывать вопрос.