2009-08-31 27 views
5

.NET chúng ta có kiểu dữ liệu nguyên thủy như kiểu int và giá trị như struct.Cách phân biệt tham chiếu so với kiểu nguyên thủy và giá trị

Và chúng tôi cũng có các loại tham chiếu. Tất cả chúng dường như được bắt nguồn từ lớp đối tượng.

Cách .NET xác định kiểu gốc, giá trị dựa vào loại tham chiếu?

Hoàn thành công việc ở đâu? Tại trình biên dịch hoặc tại JIT?

Điều này có thuộc về khả năng của trình biên dịch không?

+0

Tôi rất tiếc nhưng tôi không hiểu câu hỏi của bạn. –

Trả lời

11

Tất cả các loại giá trị, bao gồm các nguyên tố chung của Hệ thống Kiểu chung (CTS), lấy trực tiếp TRỰC TIẾP từ loại CTS "System.ValueType", (ngoại trừ enums).

Vì vậy, trình biên dịch có thể biết bằng cách kiểm tra loại cơ sở của bất kỳ loại nào. Nếu đó là "System.ValueType", thì đó là loại giá trị, nếu không, đó là loại tham chiếu.

Edit: Enums, như trong

public Enum Shipper {FedEx, Aerborne, USPS, Stork} 

... không lấy trực tiếp từ System.ValueType, họ xuất phát từ System.Enum, mà xuất phát từ System.ValueType ...

+0

Ngoại trừ 'System.Enum', xuất phát từ' System.ValueType' nhưng không phải là loại giá trị. Nhưng tất cả các kiểu 'enum' * là * các kiểu giá trị xuất phát từ' System.Enum' làm cho kiểu cơ sở của chúng không phải là 'System.ValueType'. Vì vậy, các loại giá trị là các kiểu bắt nguồn từ 'System.ValueType' ngoại trừ' System.Enum', mặc dù việc thực hiện nội bộ của thử nghiệm này có thể được thực hiện hiệu quả hơn điều này. –

+0

Cảm ơn Charles. Liệu java hoạt động theo cách tương tự? –

+0

@ 280Z28: Tôi không chắc điều đó có nghĩa là gì, vì System.Enum không phải là loại bạn có thể sử dụng trực tiếp. Trong thực tế, nó thậm chí không thực sự đủ để sử dụng như một ràng buộc trên một loại chung (xem dưới cùng của http://msdn.microsoft.com/en-us/library/d5x73970.aspx). –

2

Các loại giá trị thực sự có nguồn gốc từ System.ValueType chính nó bắt nguồn từ System.Object.

2

Value các loại có nguồn gốc từ System.ValueType, trong đó, trong số những thứ khác, cung cấp triển khai mặc định (nhưng chậm) là GetHashCodeEquals. (Chúng chậm bởi vì chúng sử dụng sự phản chiếu).

Các loại nguyên thủy như int có thể được đóng hộp thành các loại giá trị trong IL bằng cách sử dụng hướng dẫn box. Họ có các hướng dẫn IL đặc biệt để làm việc với họ.

Loại tham chiếu là tất cả các lớp khác.

Cũng có các con trỏ, có thể được sử dụng trong mã unsafe và không xuất phát từ số object. EDIT - proof.

+0

Bạn có chắc là các kiểu con trỏ không xuất phát từ IntPtr? –

+0

Có, chúng hoàn toàn không liên quan. Đối với một điều, 'IntPtr' là một cấu trúc, và bạn không thể lấy được từ một cấu trúc. – SLaks

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