Подтвердить что ты не робот

Есть ли 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?

4b9b3361

Ответ 1

В CLR 2.0 и ранее отсутствует Guid.TryParse. Он будет доступен начиная с CLR 4.0 и Visual Studio 2010.

Что до этого не было. Обычно такие вопросы обычно трудно ответить правильно. Скорее всего, это была проблема контроля или времени. Если вы откроете mscorlib в отражателе, вы увидите, что на нем есть метод TryParse на Guid, но он закрыт. В некоторых случаях он также вызывает исключение, поэтому он не является хорошим эквивалентом, чтобы сказать Int32.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, вы уже хорошо себя чувствуете и не должны меняться.