Есть ли GUID.TryParse() в .NET 3.5?
Вопрос
Обновить
Guid.TryParse доступен в .NET 4.0
ЗАВЕРШЕНИЕ ОБНОВЛЕНИЯ
Очевидно, что общедоступного GUID нет.Попробуйте использовать функцию TryParse() в .NET CLR 2.0.
Итак, я изучал регулярные выражения [он же поиск в Google в поисках одного], и каждый раз, когда я его находил, в разделе комментариев разгорался жаркий спор о том, что регулярное выражение A не работает, используйте регулярное выражение B.Тогда кто-нибудь написал бы регулярное выражение C, блядь, блядь
Так или иначе, я решил сделать вот что, но я чувствую себя неловко из-за этого.
public static bool IsGuid (string possibleGuid) {
try {
Guid gid = new Guid(possibleGuid);
return true;
} catch (Exception ex) {
return false;
}
}
Очевидно, что мне это не очень нравится, так как с первого дня мне вбили в голову, что нужно избегать создания исключений, если вы можете защитным кодом обойти это.
Кто-нибудь знает, почему нет общедоступного Guid.TryParse() в .NET Framework?
Есть ли у кого-нибудь реальное Регулярное выражение, которое будет работать для всех идентификаторов GUID?
Решение
Нет Guid.Попробуйте проанализировать в CLR 2.0 и более ранних версиях.Он будет доступен, начиная с CLR 4.0 и Visual Studio 2010.
Относительно того, почему этого не было.На подобные вопросы обычно трудно ответить правильно.Скорее всего, это была оплошность или проблема с ограничением времени.Если вы откроете mscorlib в reflector, вы увидите, что на самом деле существует метод с именем TryParse на Guid
но это личное.Он также генерирует исключение в определенных случаях, так что это не очень хороший эквивалент, чтобы сказать Int32.TryParse
.
Другие советы
Идентификатор пользователя.Попробуйте проанализировать реализация с использованием регулярных выражений.
IsGuid реализован как метод расширения для строки...
public static bool IsGuid(this string stringValue)
{
string guidPattern = @"[a-fA-F0-9]{8}(\-[a-fA-F0-9]{4}){3}\-[a-fA-F0-9]{12}";
if(string.IsNullOrEmpty(stringValue))
return false;
Regex guidRegEx = new Regex(guidPattern);
return guidRegEx.IsMatch(stringValue);
}
Эта реализация a TryParse
for Guids использует try-catch для того, чтобы перехватить неверно сформированные Guids.Он реализован как метод расширения и должен быть помещен в статический класс:
public static bool TryParseGuid(this string s, out Guid guid)
{
try {
guid = new Guid(s);
return true;
} catch {
guid = Guid.Empty;
return false;
}
}
Это может быть вызвано с помощью
string s = "{CA761232-ED42-11CE-BACD-00AA0057B223}";
Guid id;
if (s.TryParseGuid(out id) {
// TODO: use id
} else {
// Sorry not a valid Guid.
}
Начиная с C # 7.0 / Visual Studio 2017, вы можете вызывать его с:
string s = "{CA761232-ED42-11CE-BACD-00AA0057B223}";
if (s.TryParseGuid(out Guid id) {
// TODO: use id
} else {
// Sorry not a valid Guid.
}
Обновить
Начиная с Visual Studio 2010 / .NET Framework 4.0, System.Guid
обеспечивает TryParse
и a TryPareExact
способ.
С точки зрения того, почему его нет, это оплошность.Там будет Guid.TryParse
в .NET 4 (см. Запись в блоге BCL для получения подробной информации).
Насколько мне известно, на данный момент в .NET Framework нет функциональности TryParse.Вам придется прибегнуть к регулярному выражению или опции try-catch .Регулярные выражения мне не по вкусу, поэтому я уверен, что кто-нибудь другой опубликует ответ.
Исключения требуют больших затрат с точки зрения производительности, поэтому мой голос отдается варианту регулярного выражения.
Это должно сработать:
@"^\{?[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}\}?$"
Вы можете написать свой собственный TryParse в качестве метода расширения для Guid.Затем, когда появляется "настоящий" из MS, вы уже готовы к работе и вам не нужно ничего менять.