ทำไมไม่มี Guid.IsNullOrEmpty () วิธีการ


103

สิ่งนี้ทำให้ฉันสงสัยว่าทำไม Guid ใน. NET ไม่มีIsNullOrEmpty()วิธีการ (โดยที่ว่างหมายถึงศูนย์ทั้งหมด)

ฉันต้องการสิ่งนี้ในหลาย ๆ ที่ในโค้ด ASP.NET MVC ของฉันเมื่อเขียน REST API

หรือฉันพลาดอะไรไปเพราะไม่มีใครถามหาสิ่งเดียวกันบนอินเทอร์เน็ต


เพื่อเริ่มต้นปิดstackoverflow.com/questions/2344213/…แต่สำหรับความต้องการของคุณมีGuid.Empty
V4Vendetta

คำตอบ:


236

Guidเป็นประเภทค่าดังนั้นตัวแปรประเภทGuidจึงไม่สามารถเริ่มต้นด้วยค่าว่างได้ หากคุณต้องการทราบว่ามันเหมือนกับ guid ที่ว่างเปล่าหรือไม่คุณสามารถใช้:

if (guid == Guid.Empty)

แล้วกรณีที่ Entity Framework กำหนดตัวแปร Guid เป็น Guid ล่ะ? (ว่างเปล่า)?
Gautam Jain

6
@goths: จากนั้นคุณสามารถใช้if (nullableGuid == null || nullableGuid == Guid.Empty)... หรือสร้างวิธีการขยายของคุณเองถ้าคุณต้องการจริงๆ น่าจะเกิดขึ้นน้อยมากจนไม่คุ้มค่าสำหรับคนส่วนใหญ่
Jon Skeet

2
@goths คุณสามารถสร้างวิธีการขยายทั่วไปสำหรับประเภทค่าทั้งหมด ตัวอย่างเช่น:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen


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 อยู่หรือเปล่า? หรือ Guid (เหมาะสำหรับ re-factoring ฯลฯ )

/// <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()ในความเป็นจริงจะสร้าง guid ที่ว่างเปล่า ตั้งใจเขียนg = Guid.NewGuid()รึเปล่า?
David Hedlund

0

ตามที่คนอื่น ๆ ชี้ให้เห็นหลักฐานของคำถามไม่ได้อยู่ที่นั่นทั้งหมด C # Guidไม่เป็นโมฆะ อย่างไรก็ตามGuid?คือ วิธีที่สะอาดในการตรวจสอบว่า a 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 #

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.