Mengapa tidak ada metode Guid.IsNullOrEmpty ()

103

Ini membuat saya bertanya-tanya mengapa Guid in .NET tidak memiliki IsNullOrEmpty() metode (di mana kosong berarti semua nol)

Saya membutuhkan ini di beberapa tempat di kode ASP.NET MVC saya saat menulis REST API.

Atau apakah saya melewatkan sesuatu karena tidak ada orang di Internet yang meminta hal yang sama?

Gautam Jain
sumber
Untuk memulai stackoverflow.com/questions/2344213/… tetapi untuk kebutuhan Anda adaGuid.Empty
V4Vendetta

Jawaban:

236

Guidadalah tipe nilai , jadi variabel tipe Guidtidak boleh nol untuk memulai. Jika Anda ingin tahu apakah itu sama dengan pedoman kosong, Anda bisa menggunakan:

if (guid == Guid.Empty)
Jon Skeet
sumber
Bagaimana dengan kasus di mana Entity Framework mendefinisikan variabel Guid sebagai Guid? (nullable)?
Gautam Jain
6
@ goths: Kemudian Anda dapat menggunakan if (nullableGuid == null || nullableGuid == Guid.Empty)... atau membuat metode ekstensi Anda sendiri jika Anda benar-benar menginginkannya. Agaknya hal itu cukup jarang muncul sehingga tidak sepadan bagi kebanyakan orang.
Jon Skeet
2
@goths Anda dapat membuat metode ekstensi umum untuk semua jenis nilai. Misalnya:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen
27

Untuk satu hal, Guidtidak dapat dibatalkan. Anda dapat memeriksa:

myGuid == default(Guid)

yang setara dengan:

myGuid == Guid.Empty
David Hedlund
sumber
2
Mulai c # 7.1, Anda dapat menggunakanmyGuid == default
Brad M
10

Berikut adalah metode ekstensi sederhana untuk Panduan 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);
}

MEMPERBARUI

Jika Anda benar-benar ingin menggunakan ini di mana pun Anda dapat menulis metode ekstensi lain untuk Panduan biasa. Ini tidak pernah bisa nol, jadi beberapa orang tidak akan menyukai ini ... tetapi ini memenuhi tujuan yang Anda cari dan Anda tidak perlu tahu apakah Anda bekerja dengan Guid? atau Panduan (bagus untuk memfaktorkan ulang, dll.).

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

Sekarang Anda dapat menggunakan someGuid.IsNullOrEmpty();di semua kasus, apakah Anda menggunakan Panduan atau Panduan ?.

Seperti yang saya katakan, beberapa orang akan mengeluh tentang penamaan karena IsNullOrEmpty()menyiratkan bahwa nilainya bisa nol (bila tidak bisa). Jika Anda benar-benar ingin, buat nama yang berbeda untuk ekstensi seperti IsNothing()atau IsInsignificant()atau apa pun :)

Justin
sumber
2

Anda dapat membuat metode ekstensi ke Guid untuk menambahkan fungsionalitas 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
sumber
g = new Guid()sebenarnya akan membuat pedoman kosong. Apakah Anda berniat untuk menulis g = Guid.NewGuid()?
David Hedlund
0

Seperti yang ditunjukkan orang lain, premis pertanyaan tidak semuanya ada. C # Guidtidak bisa dibatalkan. Namun demikian Guid?. Cara yang bersih untuk memeriksa apakah a Guid?adalah nullatau Guid.Emptydengan memeriksa apakah hasilnya GetValueOrDefault()adalah Guid.Empty. Misalnya,

Guid? id;

// some logic sets id

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

Anda tahu saya melihat pernyataan seperti ini sepanjang waktu

Guid adalah tipe nilai, jadi variabel tipe Guid tidak boleh nol untuk memulai

tetapi ini TIDAK BENAR.

Setuju Anda tidak dapat memprogram menetapkan Panduan ke null, tetapi ketika beberapa SQL menarik UniqueIdentifier dan memetakannya ke Panduan, dan jika nilai tersebut adalah null di db, nilainya akan muncul sebagai null di C #.

Paul Gorbas
sumber