2012-02-08 34 views
8

Vì vậy, tôi đang làm rất nhiều công việc cơ sở dữ liệu trong một ứng dụng - và có một số giá trị trả về có thể có của hệ thống bộ nhớ đệm của tôi. Nó có thể trả về null, nó có thể trả về một kiểu mặc định (type) hoặc nó có thể trả về một đối tượng không hợp lệ (bởi đối tượng không hợp lệ, ý tôi là một đối tượng có giá trị/thuộc tính không chính xác). Tôi muốn tạo một phương thức tiện ích mở rộng để thực hiện tất cả các kiểm tra đó cho tôi, như vậy:Phương thức mở rộng kiểm tra đơn giản

public static bool Valid<T> (this T obj) where T: class 
    { 
     if (obj == null) 
      return false; 
     else if (obj == default(T)) 
      return false; 
     //Other class checks here 
     else 
      return true; 
    } 

Vấn đề là, trình biên dịch của tôi nói với tôi rằng if (obj == default(T)) sẽ luôn là sai.

Tại sao lại như vậy?

+0

Ứng dụng có cung cấp cho bạn lỗi hoặc cảnh báo trình biên dịch hay không. Tôi không nhận được. nó biên dịch tốt. –

+3

@GregB. Nó có thể là 'resharper' cho anh ta một gợi ý ... – gdoron

+0

@GregB vâng, tôi đã resharper. – caesay

Trả lời

21

Vì bạn có ràng buộc "lớp" (where T: class), default(T)luôn là bằng không. Bạn đã có một kiểm tra cho rằng trong bản gốc nếu tuyên bố, vì vậy trường hợp thứ hai (obj == default(T)) không bao giờ có thể là sự thật.

0

Quyết định đầu tiên bạn cần thực hiện là: Có thể T là loại giá trị như int?
Nếu vậy bạn có thể xóa

where T: class 

if (obj == null) return false; 
else 

Nếu T luôn là một loại tài liệu tham khảo bạn có thể xóa

if (obj == null) return false; 
1

Tôi không chắc chắn nếu bạn đang kìm hãm nó đến lớp bởi vì bạn muốn hoặc bởi vì bạn cảm thấy bạn phải. Nếu đó là thứ hai, đây là một cách để làm giá trị mặc định kiểm tra trên các loại phức tạp và đơn giản:

public static bool Valid<T> (this T obj) 
{ 
    return !EqualityComparer<T>.Default.Equals(obj, default(T)); 
} 

Nếu lựa chọn của bạn để hạn chế nó đến lớp chỉ là cố ý hay cho một trường hợp kinh doanh, cảm thấy tự do để bỏ qua đề nghị này . Một điều khác mà điều này có thể không giải thích là việc sử dụng các loại đơn giản (mặc dù tôi thường sử dụng các kiểu đơn giản không có trong những ngày này, mã này hoạt động cho).

Các vấn đề liên quan