Warum gibt es keine Guid.IsNullOrEmpty () -Methode?

103

Ich frage mich daher immer wieder, warum Guid in .NET keine IsNullOrEmpty()Methode hat (wobei leer alle Nullen bedeutet).

Ich benötige dies an mehreren Stellen in meinem ASP.NET MVC-Code, wenn ich die REST-API schreibe.

Oder fehlt mir etwas, weil niemand im Internet danach gefragt hat?

Gautam Jain
quelle
Um stackoverflow.com/questions/2344213/… zu starten, aber für Ihre Bedürfnisse gibt esGuid.Empty
V4Vendetta

Antworten:

234

Guidist ein Werttyp , daher kann eine Variable vom Typ zunächst Guidnicht null sein. Wenn Sie wissen möchten, ob es mit der leeren Guid identisch ist, können Sie einfach Folgendes verwenden:

if (guid == Guid.Empty)
Jon Skeet
quelle
Was ist mit Fällen, in denen Entity Framework Guid-Variablen als Guid definiert? (nullbar)?
Gautam Jain
6
@goths: Dann könnten Sie if (nullableGuid == null || nullableGuid == Guid.Empty)... oder Ihre eigene Erweiterungsmethode erstellen, wenn Sie wirklich wollen. Vermutlich kommt es selten genug vor, dass es sich für die meisten Menschen nicht lohnt.
Jon Skeet
2
@goths Sie können eine allgemeine Erweiterungsmethode für alle Werttypen erstellen. Zum Beispiel:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen
26

Zum einen Guidist nicht nullbar. Sie könnten überprüfen:

myGuid == default(Guid)

was äquivalent ist zu:

myGuid == Guid.Empty
David Hedlund
quelle
2
Ab c # 7.1 können Sie einfachmyGuid == default
Brad M
10

Hier ist eine einfache Erweiterungsmethode für eine nullfähige Guid.

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

AKTUALISIEREN

Wenn Sie dies wirklich überall verwenden möchten, können Sie eine andere Erweiterungsmethode für eine reguläre Guid schreiben. Es kann niemals null sein, also werden manche Leute das nicht mögen ... aber es erfüllt den Zweck, den Sie suchen und Sie müssen nicht wissen, ob Sie mit Guid arbeiten? oder Guid (schön zum Re-Factoring etc.).

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

Jetzt können Sie someGuid.IsNullOrEmpty();in allen Fällen verwenden, ob Sie Guid oder Guid? Verwenden.

Wie ich bereits sagte, werden sich einige Leute über die Benennung beschweren, da dies IsNullOrEmpty()impliziert, dass der Wert null sein könnte (wenn dies nicht möglich ist). Wenn Sie wirklich wollten, kommen Sie mit einem anderen Namen für die Erweiterungen wie IsNothing()oder IsInsignificant()oder was auch immer :)

Justin
quelle
2

Sie können Guid eine Erweiterungsmethode zuweisen, um IsEmpty-Funktionen hinzuzufügen:

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
quelle
g = new Guid()wird in der Tat eine leere Guid erstellen. Wolltest du schreiben g = Guid.NewGuid()?
David Hedlund
0

Wie andere betont haben, ist die Prämisse der Frage nicht alles. C # Guidist nicht nullbar. Ist Guid?jedoch. Eine saubere Methode, um zu überprüfen, ob a Guid?ist nulloder Guid.Emptyist, indem überprüft wird, ob das Ergebnis von GetValueOrDefault()ist Guid.Empty. Z.B,

Guid? id;

// some logic sets id

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

Du weißt, ich sehe diese Aussagen die ganze Zeit so

Guid ist ein Werttyp, daher kann eine Variable vom Typ Guid zunächst nicht null sein

aber es ist einfach nicht wahr.

Einverstanden, dass Sie eine Guid nicht programmgesteuert auf null setzen können. Wenn jedoch SQL einen UniqueIdentifier abruft und einer Guid zuordnet und dieser Wert in der Datenbank null ist, wird der Wert in C # als null angezeigt.

Paul Gorbas
quelle