Por que não existe um método Guid.IsNullOrEmpty ()

103

Isso me mantém pensando por que Guid em .NET não tem IsNullOrEmpty()método (onde vazio significa todos zeros)

Eu preciso disso em vários lugares no meu código ASP.NET MVC ao escrever a API REST.

Ou estou perdendo algo porque ninguém na Internet pediu o mesmo?

Gautam Jain
fonte
Para começar stackoverflow.com/questions/2344213/… mas para suas necessidades, existeGuid.Empty
V4Vendetta

Respostas:

236

Guidé um tipo de valor , portanto, uma variável do tipo Guidnão pode ser nula para começar. Se você quiser saber se é o mesmo que o guid vazio, você pode apenas usar:

if (guid == Guid.Empty)
Jon Skeet
fonte
E quanto aos casos em que o Entity Framework define variáveis ​​Guid como Guid? (anulável)?
Gautam Jain
6
@goths: Então você pode usar if (nullableGuid == null || nullableGuid == Guid.Empty)... ou criar seu próprio método de extensão, se realmente quiser. Presumivelmente, raramente surge o suficiente para não valer a pena para a maioria das pessoas.
Jon Skeet
2
@goths Você pode fazer um método de extensão geral para todos os tipos de valor. Por exemplo:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen
27

Por um lado, Guidnão é anulável. Você pode verificar:

myGuid == default(Guid)

que é equivalente a:

myGuid == Guid.Empty
David Hedlund
fonte
2
A partir de c # 7.1, você pode apenas usarmyGuid == default
Brad M
10

Aqui está um método de extensão simples para um Guid anulável.

/// <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);
}

ATUALIZAR

Se você realmente quiser usar isso em todos os lugares, poderá escrever outro método de extensão para um Guid regular. Nunca pode ser nulo, então algumas pessoas não vão gostar ... mas serve ao propósito que você está procurando e você não precisa saber se está trabalhando com o Guid? ou Guid (bom para refatoração etc.).

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

Agora você pode usar someGuid.IsNullOrEmpty();em todos os casos, esteja usando Guid ou Guid ?.

Como eu disse, algumas pessoas reclamarão da nomenclatura porque IsNullOrEmpty()implica que o valor pode ser nulo (quando não pode). Se você realmente quiser, escolha um nome diferente para as extensões, como IsNothing()ou IsInsignificant()ou qualquer outra coisa :)

Justin
fonte
2

Você pode fazer um método de extensão para Guid para adicionar a funcionalidade 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
fonte
g = new Guid()irá de fato criar um guid vazio. Você pretendia escrever g = Guid.NewGuid()?
David Hedlund
0

Como outros apontaram, a premissa da questão não está completa. C # Guidnão é anulável. No entanto, Guid?é. Uma maneira limpa de verificar se a Guid?é nullou Guid.Emptyé verificando se o resultado de GetValueOrDefault()é Guid.Empty. Por exemplo,

Guid? id;

// some logic sets id

if (Guid.Empty.Equals(guid.GetValueOrDefault()))
{
    // Do something
}
Craig Niles
fonte
-1

Você sabe que eu vejo essas declarações como esta o tempo todo

Guid é um tipo de valor, portanto, uma variável do tipo Guid não pode ser nula para começar

mas simplesmente NÃO É VERDADE.

Concordo que você não pode definir de forma programática um Guid como nulo, mas quando algum SQL puxa um UniqueIdentifier e o mapeia para um Guid, e se esse valor for nulo no banco de dados, o valor surge como nulo no C #.

Paul Gorbas
fonte