สิ่งนี้ทำให้ฉันสงสัยว่าทำไม Guid ใน. NET ไม่มีIsNullOrEmpty()
วิธีการ (โดยที่ว่างหมายถึงศูนย์ทั้งหมด)
ฉันต้องการสิ่งนี้ในหลาย ๆ ที่ในโค้ด ASP.NET MVC ของฉันเมื่อเขียน REST API
หรือฉันพลาดอะไรไปเพราะไม่มีใครถามหาสิ่งเดียวกันบนอินเทอร์เน็ต
สิ่งนี้ทำให้ฉันสงสัยว่าทำไม Guid ใน. NET ไม่มีIsNullOrEmpty()
วิธีการ (โดยที่ว่างหมายถึงศูนย์ทั้งหมด)
ฉันต้องการสิ่งนี้ในหลาย ๆ ที่ในโค้ด ASP.NET MVC ของฉันเมื่อเขียน REST API
หรือฉันพลาดอะไรไปเพราะไม่มีใครถามหาสิ่งเดียวกันบนอินเทอร์เน็ต
คำตอบ:
Guid
เป็นประเภทค่าดังนั้นตัวแปรประเภทGuid
จึงไม่สามารถเริ่มต้นด้วยค่าว่างได้ หากคุณต้องการทราบว่ามันเหมือนกับ guid ที่ว่างเปล่าหรือไม่คุณสามารถใช้:
if (guid == Guid.Empty)
if (nullableGuid == null || nullableGuid == Guid.Empty)
... หรือสร้างวิธีการขยายของคุณเองถ้าคุณต้องการจริงๆ น่าจะเกิดขึ้นน้อยมากจนไม่คุ้มค่าสำหรับคนส่วนใหญ่
public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
ประการหนึ่งGuid
ไม่เป็นโมฆะ คุณสามารถตรวจสอบ:
myGuid == default(Guid)
ซึ่งเทียบเท่ากับ:
myGuid == Guid.Empty
myGuid == default
นี่คือวิธีการขยายอย่างง่ายสำหรับ 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()
หรืออะไรก็ตาม :)
คุณสามารถสร้างวิธีการขยายไปยัง 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()
รึเปล่า?
ตามที่คนอื่น ๆ ชี้ให้เห็นหลักฐานของคำถามไม่ได้อยู่ที่นั่นทั้งหมด 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
}
คุณก็รู้ว่าฉันเห็นข้อความแบบนี้ตลอดเวลา
Guid เป็นประเภทค่าดังนั้นตัวแปรประเภท Guid จึงไม่สามารถเริ่มต้นด้วยค่าว่างได้
แต่มันไม่ใช่เรื่องจริง
ตกลงว่าคุณไม่สามารถตั้งค่า Guid เป็นค่าว่างทางโปรแกรมได้ แต่เมื่อ SQL บางตัวดึง UniqueIdentifier และแมปกับ Guid และถ้าค่านั้นเป็นโมฆะใน db ค่าจะปรากฏเป็น null ใน C #
Guid.Empty