Tại sao không có phương thức Guid.IsNullOrEmpty ()


103

Điều này khiến tôi tự hỏi tại sao Guid trong .NET không có IsNullOrEmpty()phương thức (trong đó rỗng có nghĩa là tất cả các số không)

Tôi cần điều này ở một số vị trí trong mã ASP.NET MVC của mình khi viết API REST.

Hay tôi đang thiếu thứ gì đó vì không ai trên Internet yêu cầu điều tương tự?


Để bắt đầu stackoverflow.com/questions/2344213/… nhưng đối với nhu cầu của bạn thì cóGuid.Empty
V4Vendetta

Câu trả lời:


236

Guidlà một kiểu giá trị , vì vậy một biến kiểu Guidkhông được để trống để bắt đầu. Nếu bạn muốn biết nó có giống với hướng dẫn trống không, bạn có thể sử dụng:

if (guid == Guid.Empty)

Còn những trường hợp Entity Framework xác định biến Guid là Guid thì sao? (vô hiệu)?
Gautam Jain

6
@goths: Sau đó, bạn có thể sử dụng if (nullableGuid == null || nullableGuid == Guid.Empty)... hoặc tạo phương thức mở rộng của riêng bạn nếu bạn thực sự muốn. Có lẽ nó hiếm khi xuất hiện đến mức không đáng đối với hầu hết mọi người.
Jon Skeet

2
@goths Bạn có thể tạo một phương thức mở rộng chung cho tất cả các loại giá trị. Ví dụ:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
Jeppe Stig Nielsen,

27

Đối với một điều, Guidkhông phải là vô hiệu. Bạn có thể kiểm tra:

myGuid == default(Guid)

tương đương với:

myGuid == Guid.Empty

2
Kể từ c # 7.1, bạn chỉ có thể sử dụngmyGuid == default
Brad M

10

Đây là một phương pháp mở rộng đơn giản cho một Hướng dẫn vô hiệu.

/// <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);
}

CẬP NHẬT

Nếu bạn thực sự muốn sử dụng nó ở mọi nơi, bạn có thể viết một phương thức mở rộng khác cho một Hướng dẫn thông thường. Nó không bao giờ có thể rỗng, vì vậy một số người sẽ không thích điều này ... nhưng nó phục vụ mục đích bạn đang tìm kiếm và bạn không cần phải biết liệu bạn có đang làm việc với Guid không? hoặc Hướng dẫn (tốt cho việc tính toán lại, v.v.).

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

Bây giờ bạn có thể sử dụng someGuid.IsNullOrEmpty();trong mọi trường hợp, cho dù bạn đang sử dụng Guid hay Guid ?.

Như tôi đã nói, một số người sẽ phàn nàn về cách đặt tên vì IsNullOrEmpty()ngụ ý rằng giá trị có thể là null (khi nó không thể). Nếu bạn thực sự muốn, đưa ra một cái tên khác cho các phần mở rộng như IsNothing()hoặc IsInsignificant()hoặc bất cứ điều gì :)


2

Bạn có thể tạo một phương thức mở rộng cho Guid để thêm chức năng 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()trên thực tế sẽ tạo ra một hướng dẫn trống. Bạn đã có ý định viết g = Guid.NewGuid()?
David Hedlund

0

Như những người khác đã chỉ ra, tiền đề của câu hỏi không phải là tất cả. C # Guidkhông thể nullable. Tuy nhiên, Guid?là. Một cách rõ ràng để kiểm tra xem a Guid?nullhay không Guid.Emptybằng cách kiểm tra xem kết quả của GetValueOrDefault()Guid.Empty. Ví dụ,

Guid? id;

// some logic sets id

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

-1

Bạn biết đấy, tôi luôn thấy câu nói như thế này

Guid là một kiểu giá trị, vì vậy một biến kiểu Guid không được để trống để bắt đầu bằng

nhưng nó chỉ là KHÔNG ĐÚNG.

Đã đồng ý rằng bạn không thể lập trình đặt Hướng dẫn thành null, nhưng khi một số SQL kéo vào Bộ định danh duy nhất và ánh xạ nó tới Hướng dẫn và nếu giá trị đó là null trong db, giá trị sẽ xuất hiện dưới dạng null trong C #.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.