Чому не існує методу Guid.IsNullOrEmpty ()


103

Це змушує мене цікавитись, чому в Guid в .NET немає IsNullOrEmpty()методу (де порожній означає всі нулі)

Мені це потрібно в декількох місцях мого коду ASP.NET MVC під час написання API REST.

Або я щось пропускаю, тому що ніхто в Інтернеті цього не просив?


Для початку stackoverflow.com/questions/2344213/… але для ваших потреб єGuid.Empty
V4Vendetta

Відповіді:


236

Guidце тип значення , тому змінна типу Guidне може бути нульовою для початку. Якщо ви хочете дізнатися, чи це те саме, що і порожній навідник, ви можете просто скористатися:

if (guid == Guid.Empty)

Що з випадками, коли Entity Framework визначає змінні Guid як Guid? (нульовий)?
Гаутам Джайн

6
@goths: Тоді ви можете використовувати if (nullableGuid == null || nullableGuid == Guid.Empty)... або створити свій власний метод розширення, якщо дуже хочете. Імовірно, це виникає досить рідко, що це не варто для більшості людей.
Джон Скіт

2
@goths Ви можете зробити загальний метод розширення для всіх типів значень. Наприклад:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen

27

З одного боку, Guidне зводиться до нуля. Ви можете перевірити:

myGuid == default(Guid)

що еквівалентно:

myGuid == Guid.Empty

2
Станом на c # 7.1, ви можете просто скористатисяmyGuid == default
Brad M

10

Ось простий метод розширення для зведеного 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);
}

ОНОВЛЕННЯ

Якщо ви дійсно хотіли використовувати це скрізь, ви можете написати інший метод розширення для звичайного Guid. Це ніколи не може бути недійсним, тому деяким людям це не сподобається ... але це відповідає тій меті, яку ви шукаєте, і вам не потрібно знати, чи працюєте ви з Guid? або Керівництво (приємно для повторного факторингу тощо).

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

Тепер ви можете використовуватись someGuid.IsNullOrEmpty();у всіх випадках, будь то Guid чи Guid ?.

Як я вже говорив, деякі люди будуть скаржитися на називання, оскільки IsNullOrEmpty()випливає, що значення може бути нульовим (коли воно не може). Якщо ви дійсно хочете, придумати іншу назву для розширення , наприклад , IsNothing()або , IsInsignificant()або яким - то :)


2

Ви можете зробити метод розширення в Guid, щоб додати функціонал 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()насправді створить порожній путівник. Ви мали намір написати g = Guid.NewGuid()?
Девід Хедлунд

0

Як зазначають інші, передумови цього питання не всі. C # Guidне зводиться до нуля. Однак, Guid?є. Чистий спосіб перевірки , якщо Guid?це nullабо Guid.Emptyє чеком , якщо результат GetValueOrDefault()є Guid.Empty. Наприклад,

Guid? id;

// some logic sets id

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

-1

Ви знаєте, я постійно бачу подібні твердження

Guid - тип значення, тому змінна типу Guid не може бути нульовою для початку

але це просто НЕ ІСТИНА.

Погоджено, що ви не можете програмно встановити нульове значення Guid, але коли деякий SQL тягне в UniqueIdentifier і відображає його до Guid, і якщо це значення є нульовим в db, значення з'являється як null в C #.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.