Почему нет метода Guid.IsNullOrEmpty ()

103

Это заставляет меня задуматься, почему Guid в .NET не имеет IsNullOrEmpty()метода (где пустой означает все нули)

Мне это нужно в нескольких местах моего кода ASP.NET MVC при написании REST API.

Или я чего-то упускаю, потому что никто в Интернете не просил того же?

Гаутам Джайн
источник
Для начала stackoverflow.com/questions/2344213/… но для ваших нужд естьGuid.Empty
V4Vendetta

Ответы:

236

Guidявляется типом значения , поэтому переменная типа Guidне может иметь значение null для начала. Если вы хотите узнать, совпадает ли он с пустым идентификатором, вы можете просто использовать:

if (guid == Guid.Empty)
Джон Скит
источник
А как насчет случаев, когда Entity Framework определяет переменные Guid как Guid? (обнуляемый)?
Gautam Jain
6
@goths: Тогда вы можете использовать if (nullableGuid == null || nullableGuid == Guid.Empty)... или создать свой собственный метод расширения, если хотите. По-видимому, это случается достаточно редко, и для большинства людей оно того не стоит.
Джон Скит
2
@goths Вы можете создать общий метод расширения для всех типов значений. Например:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen
28

Во-первых, Guidне допускает значения NULL. Вы можете проверить:

myGuid == default(Guid)

что эквивалентно:

myGuid == Guid.Empty
Дэвид Хедлунд
источник
2
Начиная с C # 7.1, вы можете просто использоватьmyGuid == default
Brad M
10

Вот простой метод расширения для Guid, допускающего значение NULL.

/// <summary>
/// Determines if a nullable Guid (Guid?) is null or Guid.Empty
/// </summary>
public static bool IsNullOrEmpty(this Guid? guid)
{
  return (!guid.HasValue || guid.Value == Guid.Empty);
}

ОБНОВИТЬ

Если вы действительно хотите использовать это везде, вы можете написать другой метод расширения для обычного Guid. Он никогда не может быть нулевым, поэтому некоторым это не понравится ... но он служит той цели, которую вы ищете, и вам не нужно знать, работаете ли вы с Guid? или Guid (удобно для рефакторинга и т. д.).

/// <summary>
/// Determines if Guid is Guid.Empty
/// </summary>
public static bool IsNullOrEmpty(this Guid guid)
{
  return (guid == Guid.Empty);
}

Теперь вы можете использовать его someGuid.IsNullOrEmpty();во всех случаях, используете ли вы Guid или Guid ?.

Как я уже сказал, некоторые люди будут жаловаться на именование, потому что IsNullOrEmpty()подразумевает, что значение может быть нулевым (когда это невозможно). Если вы действительно хотите, придумать другое имя для расширения , например , IsNothing()или , IsInsignificant()или каким - то :)

Джастин
источник
2

Вы можете сделать метод расширения для Guid, чтобы добавить функциональность IsEmpty:

public static class GuidEx
{
    public static bool IsEmpty(this Guid guid)
    {
        return guid == Guid.Empty;
    }
}

public class MyClass
{
    public void Foo()
    {
        Guid g;
        bool b;

        b = g.IsEmpty(); // true

        g = Guid.NewGuid();

        b = g.IsEmpty; // false

        b = Guid.Empty.IsEmpty(); // true
    }
}
SimpleVar
источник
g = new Guid()фактически создаст пустой гид. Вы собирались писать g = Guid.NewGuid()?
Дэвид Хедлунд
0

Как отмечали другие, не вся предпосылка вопроса. C # Guidне допускает значения NULL. Однако Guid?есть. Чистый способ проверки , если Guid?это nullили Guid.Emptyявляется чеком , если результат GetValueOrDefault()есть Guid.Empty. Например,

Guid? id;

// some logic sets id

if (Guid.Empty.Equals(guid.GetValueOrDefault()))
{
    // Do something
}
Крейг Найлз
источник
-1

Вы знаете, я все время вижу подобные утверждения

Guid - это тип значения, поэтому переменная типа Guid не может иметь значение null для начала.

но это просто НЕПРАВДА.

Согласны, вы не можете программно установить Guid равным null, но когда какой-то SQL извлекает UniqueIdentifier и сопоставляет его с Guid, и если это значение равно null в db, значение появляется как null в C #.

Павел Горбас
источник