Dlaczego nie ma metody Guid.IsNullOrEmpty ()

103

To sprawia, że ​​zastanawiam się, dlaczego Guid w .NET nie ma IsNullOrEmpty()metody (gdzie puste oznacza wszystkie zera)

Potrzebuję tego w kilku miejscach w moim kodzie ASP.NET MVC podczas pisania interfejsu API REST.

A może coś mi brakuje, ponieważ nikt w Internecie nie prosił o to samo?

Gautam Jain
źródło
Na początek stackoverflow.com/questions/2344213/… ale dla twoich potrzeb jestGuid.Empty
V4Vendetta

Odpowiedzi:

236

Guidjest typem wartości , więc zmienna typu Guidnie może mieć wartości null na początku. Jeśli chcesz wiedzieć, czy jest taki sam jak pusty guid, możesz po prostu użyć:

if (guid == Guid.Empty)
Jon Skeet
źródło
A co z przypadkami, w których Entity Framework definiuje zmienne Guid jako Guid? (dopuszczalny)?
Gautam Jain
6
@goths: Wtedy możesz użyć if (nullableGuid == null || nullableGuid == Guid.Empty)... lub stworzyć własną metodę rozszerzenia, jeśli naprawdę chcesz. Przypuszczalnie pojawia się na tyle rzadko, że dla większości ludzi nie jest to tego warte.
Jon Skeet
2
@goths Możesz utworzyć ogólną metodę rozszerzenia dla wszystkich typów wartości. Na przykład:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen
28

Po pierwsze, Guidnie jest dopuszczalna. Możesz sprawdzić:

myGuid == default(Guid)

co jest równoważne z:

myGuid == Guid.Empty
David Hedlund
źródło
2
Od c # 7.1 możesz po prostu użyćmyGuid == default
Brad M
10

Oto prosta metoda rozszerzenia dla wartości Guid dopuszczającej wartość 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);
}

AKTUALIZACJA

Jeśli naprawdę chcesz używać tego wszędzie, możesz napisać inną metodę rozszerzenia dla zwykłego Guid. Nigdy nie może być zerowe, więc niektórym ludziom się to nie spodoba ... ale spełnia to, czego szukasz i nie musisz wiedzieć, czy pracujesz z Guidem? lub Guid (miły do ​​ponownego fakturowania itp.).

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

Teraz możesz używać someGuid.IsNullOrEmpty();we wszystkich przypadkach, niezależnie od tego, czy używasz Guid, czy Guid ?.

Jak powiedziałem, niektórzy ludzie będą narzekać na nazewnictwo, ponieważ IsNullOrEmpty()sugeruje, że wartość może być zerowa (jeśli nie może). Jeśli naprawdę chciał, wymyślić inną nazwą dla rozszerzeń, takich jak IsNothing()lub IsInsignificant()czy cokolwiek :)

Justin
źródło
2

Możesz utworzyć metodę rozszerzenia w Guid, aby dodać funkcję 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
źródło
g = new Guid()w rzeczywistości stworzy pusty guid. Czy miałeś zamiar pisać g = Guid.NewGuid()?
David Hedlund
0

Jak zauważyli inni, przesłanka tego pytania nie istnieje. C # Guidnie dopuszcza wartości null. Jednak Guid?jest. Czysty sposób sprawdzenia, czy Guid?jest, nullczy Guid.Emptyjest, poprzez sprawdzenie, czy wynik GetValueOrDefault()jest Guid.Empty. Na przykład,

Guid? id;

// some logic sets id

if (Guid.Empty.Equals(guid.GetValueOrDefault()))
{
    // Do something
}
Craig Niles
źródło
-1

Wiesz, że widzę takie stwierdzenia przez cały czas

Guid jest typem wartości, więc zmienna typu Guid nie może mieć wartości null na początku

ale to po prostu NIE PRAWDA.

Uzgodniono, że nie można programowo ustawić Guid na null, ale gdy niektóre SQL ściąga UniqueIdentifier i mapuje go na Guid, a jeśli ta wartość jest null w bazie danych, wartość pojawia się jako null w C #.

Paul Gorbas
źródło