2013-05-16 45 views
11

Theo this một chuỗi (hoặc Chuỗi) là một loại tham chiếu.Tại sao Type.IsByRef cho kiểu String trả về false nếu String là một kiểu tham chiếu?

Tuy nhiên, đưa ra:

Type t = typeof(string); 

sau đó

if (t.IsByRef) ...  

false trả

tại sao?

Chỉnh sửa: Sau một số thử nghiệm nhanh, tôi rõ ràng là hiểu sai mục đích của IsByRef ... thậm chí sử dụng tên lớp thay cho 'chuỗi', trả về giá trị false. Tôi đang viết một lớp chung chung và muốn kiểm tra nếu một trong các loại được truyền vào khi generic là khởi tạo là một giá trị hoặc kiểu tham chiếu. Làm thế nào để kiểm tra cho điều này?

+1

Từ ** 'By' ** không chỉ để trang trí, nó có ý nghĩa. ;) – Mehrdad

+0

@Mehrdad - cũng nói - bây giờ tôi biết mục đích .IsByRef! – PMBottas

Trả lời

9

Bạn nên sử dụng IsValueType thay vì:

bool f = !typeof (string).IsValueType; //return true; 

Đối với IsByRef, mục đích của khách sạn này là để xác định xem các tham số được truyền vào phương pháp mà theo ref hoặc theo giá trị.

Ví dụ bạn có một phương pháp mà a được thông qua bởi ref:

public static void Foo(ref int a) 
{ 
} 

Bạn có thể xác định xem a là vượt qua bằng cách tham khảo hay không:

bool f = typeof (Program).GetMethod("Foo") 
           .GetParameters() 
           .First() 
           .ParameterType 
           .IsByRef; //return true 
+0

Ahhhh! ánh sáng dawns trên Marblehead! Cảm ơn! – PMBottas

5

Bạn muốn kiểm tra xem đó có phải là value type hay không.

typeof(object).IsValueType :- false 
typeof(int).IsValueType :- true 
+0

@Habib Well Spotted! –

9

Có "loại tài liệu tham khảo" - mà chúng tôi có !type.IsValueType - và sau đó có các loại mà đại diện cho các tham chiếu đến mọi thứ - cho dù mục tiêu của chúng là loại giá trị hoặc loại tham chiếu.

Khi bạn nói void Foo(ref int x), các x được cho là "thông qua bằng cách tham khảo", do đó ByRef.
Dưới mui xe, x một tham khảo loại ref int, mà sẽ tương ứng với typeof(int).MakeReferenceType().

Lưu ý rằng đây là hai loại "tham chiếu" khác nhau, hoàn toàn trực giao với nhau.

(Trong thực tế, có một loại thứ ba của "tham khảo", System.TypedReference, mà chỉ là một struct
Ngoài ra còn có một loại IV tài liệu tham khảo, các loại mà mỗi lập trình viên C biết -.. Con trỏ, T*)

+3

IsByRef cũng có ý nghĩa hơn rất nhiều với nền VB, trong đó chữ ký phương thức giống nhau sẽ là: Sub Foo (ByRef x as Integer) – Jimmy

+0

Cảm ơn tất cả người trả lời! Giống như tôi đã nói, "một sự hiểu lầm rõ ràng về mục đích của .IsByRef" ... và nghĩ rằng tôi ban đầu đã sử dụng .IsValueType nhưng thay đổi thành .IsByRef như tôi muốn thử nghiệm cho 'null-ness' nghĩ rằng .IsByRef là trò chuyện của .IsValueType (nếu có, nó sẽ là .IsRefType d'oh!) – PMBottas

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