Вопрос

Обновить

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, вы уже готовы к работе и вам не нужно ничего менять.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top