¿Por qué no hay un método Guid.IsNullOrEmpty ()?

103

Esto me hace preguntarme por qué Guid en .NET no tiene un IsNullOrEmpty()método (donde vacío significa todos ceros)

Necesito esto en varios lugares de mi código ASP.NET MVC cuando escribo la API REST.

¿O me estoy perdiendo algo porque nadie en Internet ha pedido lo mismo?

Gautam Jain
fuente
Para comenzar, stackoverflow.com/questions/2344213/… pero para sus necesidades existeGuid.Empty
V4Vendetta

Respuestas:

236

Guides un tipo de valor , por lo que una variable de tipo Guidno puede ser nula para empezar. Si desea saber si es lo mismo que el guid vacío, puede usar:

if (guid == Guid.Empty)
Jon Skeet
fuente
¿Qué pasa con los casos en los que Entity Framework define las variables Guid como Guid? (anulable)?
Gautam Jain
6
@goths: Entonces podría usar if (nullableGuid == null || nullableGuid == Guid.Empty)... o crear su propio método de extensión si realmente lo desea. Es de suponer que aparece tan raramente que no vale la pena para la mayoría de las personas.
Jon Skeet
2
@goths Puede crear un método de extensión general para todos los tipos de valores. Por ejemplo:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen
27

Por un lado, Guidno admite nulos. Podrías comprobar:

myGuid == default(Guid)

que es equivalente a:

myGuid == Guid.Empty
David Hedlund
fuente
2
A partir de c # 7.1, solo puede usarmyGuid == default
Brad M
10

A continuación, se muestra un método de extensión simple para un Guid que acepta valores 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);
}

ACTUALIZAR

Si realmente quisiera usar esto en todas partes, podría escribir otro método de extensión para un Guid normal. Nunca puede ser nulo, por lo que a algunas personas no les gustará esto ... pero cumple el propósito que estás buscando y no tienes que saber si estás trabajando con Guid. o Guid (bueno para refactorizar, etc.).

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

Ahora puedes usarlo someGuid.IsNullOrEmpty();en todos los casos, ya sea que estés usando Guid o Guid ?.

Como dije, algunas personas se quejarán del nombre porque IsNullOrEmpty()implica que el valor podría ser nulo (cuando no puede). Si realmente quería, subir con un nombre diferente para las extensiones como IsNothing()o IsInsignificant()o lo que sea :)

Justin
fuente
2

Puede crear un método de extensión para Guid para agregar la funcionalidad 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
fuente
g = new Guid()de hecho, creará una guía vacía. ¿Tenías la intención de escribir g = Guid.NewGuid()?
David Hedlund
0

Como han señalado otros, la premisa de la pregunta no está del todo ahí. C # Guidno acepta valores NULL. Sin embargo, lo Guid?es. Una forma limpia de comprobar si a Guid?es nullo Guid.Emptyes mediante comprobar si el resultado de GetValueOrDefault()es Guid.Empty. P.ej,

Guid? id;

// some logic sets id

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

Sabes que veo estas declaraciones como esta todo el tiempo

Guid es un tipo de valor, por lo que una variable de tipo Guid no puede ser nula para empezar

pero NO ES CIERTO.

De acuerdo, no puede programar un Guid en nulo, pero cuando algún SQL extrae un UniqueIdentifier y lo asigna a un Guid, y si ese valor es nulo en la base de datos, el valor aparece como nulo en C #.

Paul Gorbas
fuente