Я хочу спробувати перетворити рядок у 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 недійсні (?)
Оновлення 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
. Ось чому питання та прийнята відповідь такі, якими вони є.