Я хочу попытаться преобразовать строку в 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
PS Мне не нужно было обосновывать вопрос.
4.0
. Вот почему вопрос и принятый ответ таковы.