Pourquoi n'y a-t-il pas de méthode Guid.IsNullOrEmpty ()

103

Cela me laisse me demander pourquoi Guid dans .NET n'a pas de IsNullOrEmpty()méthode (où vide signifie tous les zéros)

J'en ai besoin à plusieurs endroits dans mon code ASP.NET MVC lors de l'écriture de l'API REST.

Ou est-ce que je rate quelque chose parce que personne sur Internet ne l’a demandé?

Gautam Jain
la source
Pour commencer stackoverflow.com/questions/2344213/… mais pour vos besoins il y aGuid.Empty
V4Vendetta

Réponses:

236

Guidest un type valeur , donc une variable de type Guidne peut pas être nulle pour commencer. Si vous voulez savoir si c'est le même que le guid vide, vous pouvez simplement utiliser:

if (guid == Guid.Empty)
Jon Skeet
la source
Qu'en est-il des cas où Entity Framework définit les variables Guid comme Guid? (nullable)?
Gautam Jain
6
@goths: Ensuite, vous pouvez utiliser if (nullableGuid == null || nullableGuid == Guid.Empty)... ou créer votre propre méthode d'extension si vous le souhaitez vraiment. Vraisemblablement, cela arrive assez rarement pour que la plupart des gens ne le vaille pas.
Jon Skeet
2
@goths Vous pouvez créer une méthode d'extension générale pour tous les types de valeur. Par exemple:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen
28

D'une part, Guidn'est pas nullable. Vous pouvez vérifier:

myGuid == default(Guid)

ce qui équivaut à:

myGuid == Guid.Empty
David Hedlund
la source
2
À partir de c # 7.1, vous pouvez simplement utilisermyGuid == default
Brad M
10

Voici une méthode d'extension simple pour un Guid nullable.

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

METTRE À JOUR

Si vous voulez vraiment l'utiliser partout, vous pouvez écrire une autre méthode d'extension pour un Guid standard. Cela ne peut jamais être nul, donc certaines personnes n'aimeront pas cela ... mais cela sert le but que vous recherchez et vous n'avez pas besoin de savoir si vous travaillez avec Guid? ou Guid (bien pour le re-factoring, etc.).

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

Vous pouvez désormais utiliser someGuid.IsNullOrEmpty();dans tous les cas, que vous utilisiez Guid ou Guid ?.

Comme je l'ai dit, certaines personnes se plaindront de la dénomination car cela IsNullOrEmpty()implique que la valeur pourrait être nulle (quand elle ne le peut pas). Si vous le vouliez vraiment, trouvez un nom différent pour les extensions comme IsNothing()ou IsInsignificant()ou autre :)

Justin
la source
2

Vous pouvez créer une méthode d'extension pour Guid pour ajouter la fonctionnalité 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
la source
g = new Guid()créera en fait un guid vide. Aviez-vous l'intention d'écrire g = Guid.NewGuid()?
David Hedlund
0

Comme d'autres l'ont souligné, la prémisse de la question n'est pas tout là. C # Guidn'est pas nullable. Cependant, Guid?c'est. Une manière propre de vérifier si a Guid?est nullou Guid.Emptyest en vérifiant si le résultat de GetValueOrDefault()est Guid.Empty. Par exemple,

Guid? id;

// some logic sets id

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

Tu sais que je vois ces déclarations comme celle-ci tout le temps

Guid est un type valeur, donc une variable de type Guid ne peut pas être nulle pour commencer

mais ce n'est tout simplement PAS VRAI.

D'accord, vous ne pouvez pas définir par programme un Guid sur null, mais lorsque certains SQL extrait un UniqueIdentifier et le mappe à un Guid, et si cette valeur est nulle dans la base de données, la valeur apparaît comme null dans le C #.

Paul Gorbas
la source