2012-01-16 27 views
6

Đây là điều kiện tôi đã sử dụng để phát hiện nếu chúng ta đang đối phó với một loại Nullable:Các cách khác nhau để kiểm tra xem một Loại có Nullable không?

System.Nullable.GetUnderlyingType(itemType) != null 

và đây mã của đồng đội của tôi:

itemType.IsGenericType && itemType.GetGenericTypeDefinition() == typeof(Nullable<>) 

Chúng tôi thực sự didnt tìm thấy một trường hợp một ý chí return true và khác false (hoặc ngược lại) nhưng 2 đoạn này có tương đương hoàn toàn không?

+0

Như tôi đã hiểu, các loại không có giá trị là một danh sách hữu hạn nhỏ. Nó sẽ không được hiệu quả hơn để xác định bởi sự hiện diện của họ? –

+1

@Jeremy: Bất kỳ 'struct' nào bạn tạo đều là một kiểu không thể null. Tôi không thể hình dung được việc tạo ra một danh sách của họ. – Gabe

+0

Có lẽ câu hỏi của tôi không rõ ràng nhưng thử nghiệm phải trả về true với "int? A" và false với "int b" –

Trả lời

4

Từ MSDN for Nullable.GetUnderlyingType Method:

Kiểu lập luận của tham số nullableType, nếu tham số nullableType là một generic loại nullable khép kín; nếu không, null.

Vì vậy, có an toàn khi sử dụng phiên bản cũ.

decompiled từ GetUnderlyingType:

public static Type GetUnderlyingType(Type nullableType) 
{ 
    if (nullableType == null) 
    throw new ArgumentNullException("nullableType"); 
    Type type = (Type) null; 
    if (nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition && nullableType.GetGenericTypeDefinition() == typeof (Nullable<>)) 
    type = nullableType.GetGenericArguments()[0]; 
    return type; 
} 
+0

Đúng, nhưng nó khác với phiên bản thứ 2? –

+0

Xem câu trả lời đã chỉnh sửa: nó cũng tương tự an toàn hơn một chút và ít hiệu quả hơn (trừ khi trình biên dịch inline) – sehe

+0

ok, GetUnderlyingType là cách để đi;) –

0

Bất cứ khi nào kiểm tra liệu một loại là nullable, tôi đã luôn luôn sử dụng phương pháp thứ hai bạn được đăng:

itemType.IsGenericType && itemType.GetGenericTypeDefinition() == typeof(Nullable<>) 

tôi đã không có một vấn đề với điều này !

Kính trọng,

+0

Chúng tôi cảm thấy cả hai đều tốt , nhưng đồng thời, chúng tôi cảm thấy như trong một bối cảnh nhất định, một trong số họ sẽ không làm việc ... –

1

Hai đoạn mã này không hoàn toàn tương đương.
Đây là trường hợp thử nghiệm mà trả về một giá trị khác nhau cho mỗi đoạn:

Type t = typeof(Nullable<>); 

bool c1 = Nullable.GetUnderlyingType(t) != null; //false 
bool c2 = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>); //true 

Do đó, phương pháp Nullable.GetUnderlyingType an toàn hơn, bởi vì nó thực hiện đã bao gồm này kiểm tra trường hợp thử nghiệm:

public static Type GetUnderlyingType(Type nullableType) { 
    if (nullableType == null) 
     throw new ArgumentNullException("nullableType"); 
    Type type = null; 
    if ((nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition) 
     && (nullableType.GetGenericTypeDefinition() == typeof(Nullable<>))) { 
     type = nullableType.GetGenericArguments()[0]; 
    } 
    return type; 
} 
+0

Vâng, chỉ cần nhận được nó từ câu trả lời của sehe! Thx anyway –

1

Mã của đồng đội của bạn là hoàn toàn tốt như được đưa ra trong tài liệu MSDN (trích đoạn): Sử dụng mã sau để xác định xem Loại o bject đại diện cho một loại Nullable. Hãy nhớ rằng mã này luôn trả về false nếu đối tượng Type được trả về từ một cuộc gọi đến GetType.

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…} 

giải thích tại bên dưới liên kết MSDN:

http://msdn.microsoft.com/en-us/library/ms366789.aspx

Hơn nữa, có một cuộc thảo luận tương tự tại này SO QA:

How to check if an object is nullable?

+0

đọc câu trả lời của sehe và Dimitry :) –

+0

@GuillaumeSlashy yup..they cả r right .. – VS1

0

dotPeek thấy điều này:

public static Type GetUnderlyingType(Type nullableType) 
{ 
    if (nullableType == null) 
    throw new ArgumentNullException("nullableType"); 
    Type type = (Type) null; 
    if (nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition && object.ReferenceEquals((object) nullableType.GetGenericTypeDefinition(), (object) typeof (Nullable<>))) 
    type = nullableType.GetGenericArguments()[0]; 
    return type; 
} 

Sự khác biệt duy nhất tôi thấy là nếu itemType là chính nó chung, ví dụ: typeof (List<>), thất bại của anh ta.Và bạn hơi chậm hơn vì nó thực sự phải tìm loại cơ bản.

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