Есть ли GUID.TryParse() в .NET 3.5?
UPDATE
Guid.TryParse доступен в .NET 4.0
END UPDATE
Очевидно, что нет открытого GUID.TryParse() в .NET CLR 2.0.
Итак, я искал регулярные выражения [ака-поиски, чтобы найти их], и каждый раз, когда я его нашел, в разделе комментариев был высказан горячий аргумент о том, что RegEx A не работает, используйте RegEx B. Тогда кто-то напишет Regex C yadda yadda
Так или иначе, то, что я решил сделать, было так, но я плохо себя чувствую.
public static bool IsGuid (string possibleGuid) {
try {
Guid gid = new Guid(possibleGuid);
return true;
} catch (Exception ex) {
return false;
}
}
Очевидно, мне это не очень нравится, поскольку он был пробурен во мне с первого дня, чтобы избежать исключения, если вы можете с уверенностью кодировать его.
Кто-нибудь знает, почему в .NET Framework нет открытого Guid.TryParse()?
Есть ли у кого-нибудь реальное регулярное выражение, которое будет работать для всех GUID?
Ответы
Ответ 1
В CLR 2.0 и ранее отсутствует Guid.TryParse. Он будет доступен начиная с CLR 4.0 и Visual Studio 2010.
Что до этого не было. Обычно такие вопросы обычно трудно ответить правильно. Скорее всего, это была проблема контроля или времени. Если вы откроете mscorlib в отражателе, вы увидите, что на нем есть метод TryParse на Guid
, но он закрыт. В некоторых случаях он также вызывает исключение, поэтому он не является хорошим эквивалентом, чтобы сказать Int32.TryParse
.
Ответ 2
реализация Guid.TryParse с использованием регулярных выражений.
Ответ 3
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);
}
Ответ 4
Эта реализация TryParse
для гидов использует попытку-catch для того, чтобы поймать пропущенные Гиды. Он реализован как метод расширения и должен быть помещен в статический класс:
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.
}
Начиная с С# 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.
}
UPDATE
Так как Visual Studio 2010/.NET Framework 4.0, System.Guid
предоставляет методы TryParse
и TryPareExact
.
Ответ 5
С точки зрения того, почему его нет, это надзор. В .NET 4 будет Guid.TryParse
(подробнее см. сообщение в блоге BCL).
Ответ 6
В .NET Framework нет возможности TryParse в .NET Framework. Вам придётся использовать RegEx или опцию try-catch. RegEx - это не моя чашка чая, поэтому я уверен, что кто-то еще отправит ответ.
Исключения составляют дорогостоящую производительность, поэтому мой голос переходит к опции RegEx.
Ответ 7
Это должно работать:
@"^\{?[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}\}?$"
Ответ 8
Вы можете написать собственный TryParse как метод расширения для Guid. Затем, когда появляется "реальный" из MS, вы уже хорошо себя чувствуете и не должны меняться.