Perché non esiste un metodo Guid.IsNullOrEmpty ()


103

Questo mi fa pensare al motivo per cui Guid in .NET non ha un IsNullOrEmpty()metodo (dove vuoto significa tutti zeri)

Ne ho bisogno in diversi punti del mio codice ASP.NET MVC durante la scrittura dell'API REST.

O mi manca qualcosa perché nessuno su Internet ha chiesto lo stesso?


Per iniziare stackoverflow.com/questions/2344213/… ma per le tue esigenze c'èGuid.Empty
V4Vendetta

Risposte:


236

Guidè un tipo di valore , quindi una variabile di tipo Guidnon può essere nulla per iniziare. Se vuoi sapere se è lo stesso del guid vuoto, puoi semplicemente usare:

if (guid == Guid.Empty)

E i casi in cui Entity Framework definisce le variabili Guid come Guid? (nullable)?
Gautam Jain

6
@goths: Quindi potresti usare if (nullableGuid == null || nullableGuid == Guid.Empty)... o creare il tuo metodo di estensione se lo desideri davvero. Presumibilmente si presenta abbastanza raramente da non valerne la pena per la maggior parte delle persone.
Jon Skeet

2
@goths È possibile creare un metodo di estensione generale per tutti i tipi di valore. Ad esempio:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen

28

Per prima cosa, Guidnon è annullabile. Potresti controllare:

myGuid == default(Guid)

che è equivalente a:

myGuid == Guid.Empty

2
A partire dal c # 7.1, puoi semplicemente usaremyGuid == default
Brad M

10

Ecco un semplice metodo di estensione per 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);
}

AGGIORNARE

Se vuoi davvero usarlo ovunque, potresti scrivere un altro metodo di estensione per un normale Guid. Non può mai essere nullo, quindi ad alcune persone non piacerà ... ma serve allo scopo che stai cercando e non devi sapere se stai lavorando con Guid? o Guid (utile per il re-factoring, ecc.).

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

Ora puoi usarlo someGuid.IsNullOrEmpty();in tutti i casi, sia che tu stia usando Guid o Guid ?.

Come ho detto, alcune persone si lamenteranno della denominazione perché IsNullOrEmpty()implica che il valore potrebbe essere nullo (quando non può). Se lo volevi davvero, trova un nome diverso per le estensioni come IsNothing()o IsInsignificant()o qualsiasi altra cosa :)


2

È possibile creare un metodo di estensione per Guid per aggiungere la funzionalità 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
    }
}

g = new Guid()creerà infatti una guida vuota. Avevi intenzione di scrivere g = Guid.NewGuid()?
David Hedlund

0

Come altri hanno sottolineato, la premessa della domanda non è tutta qui. C # Guidnon è annullabile. Tuttavia, Guid?è. Un modo pulito per verificare se a Guid?è nullo Guid.Emptyè controllando se il risultato di GetValueOrDefault()è Guid.Empty. Per esempio,

Guid? id;

// some logic sets id

if (Guid.Empty.Equals(guid.GetValueOrDefault()))
{
    // Do something
}

-1

Sai che vedo queste affermazioni come questa tutto il tempo

Guid è un tipo di valore, quindi una variabile di tipo Guid non può essere nulla per iniziare

ma è semplicemente NON VERO.

Concordato che non è possibile impostare a livello di programmazione un Guid su null, ma quando alcuni SQL inseriscono un UniqueIdentifier e lo associano a un Guid, e se quel valore è null nel db, il valore viene visualizzato come null in C #.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.