Mỗi định nghĩa của một loại có nguồn gốc từ ValueType thực sự xác định hai loại khác nhau của sự vật trong thời gian chạy: một loại đối tượng heap (mà xuất phát từ ValueType
và trong chuyển từ Object
và có chứa thông tin loại được nhúng) và một loại vị trí lưu trữ (không chứa bất kỳ thông tin loại được nhúng nào, nhưng thay vào đó yêu cầu mã sử dụng nó phải có một số phương tiện khác để biết nó là gì). Một thể hiện của kiểu đối tượng heap chứa một trường kiểu vị trí lưu trữ và mã cố gắng truy cập this
sẽ truy cập trường đó. Nếu một kiểu giá trị được đặt ngầm hoặc rõ ràng đến một vị trí lưu trữ của kiểu tham chiếu, hệ thống sẽ tạo một đối tượng heap mới với kiểu thích hợp và sao chép tất cả các trường công khai và riêng tư của kiểu giá trị vào các trường tương ứng trong đối tượng heap. Nếu đối tượng heap được truyền tới một vị trí lưu trữ kiểu giá trị, tất cả các trường công khai và riêng tư từ đối tượng heap sẽ được sao chép vào vị trí lưu trữ kiểu giá trị.
Nếu cố gắng sử dụng bất kỳ Object
hoặc phương thức giao diện nào trên đối tượng heap của một loại giá trị, phương thức sẽ được gọi giống như bất kỳ phương pháp đối tượng đống nào khác. Nếu nỗ lực được thực hiện trên một vị trí lưu trữ kiểu giá trị, đối với bất kỳ phương thức nào khác ngoài GetType
, trình biên dịch sẽ tạo ra một mã opcode "bị ràng buộc" đặc biệt, thông báo thời gian chạy của loại vị trí lưu trữ và chỉ thị Runtime để gọi địa chỉ phương pháp phù hợp với loại đó. Vì trình biên dịch sẽ có sẵn loại vị trí lưu trữ và thời gian chạy có thể sử dụng để tìm phương thức thích hợp, phương thức thích hợp có thể được gọi trực tiếp trên vị trí lưu trữ mà không phải tạo đối tượng heap mới trước. GetType
là một ngoại lệ đáng chú ý; vì nó hoạt động bằng cách kiểm tra thông tin kiểu được nhúng trong một đối tượng, nó chỉ có thể hoạt động trên những thứ có thông tin kiểu được nhúng. Do đó, đối số của nó sẽ được chuyển đổi thành dạng đối tượng đống trước cuộc gọi; GetType
sau đó sẽ có thể kiểm tra thông tin loại được nhúng của đối tượng heap đó.
tất cả các loại có nguồn gốc từ Object bằng cách nào đó. int lấy được từ ValueType xuất phát từ Object. Giả định của bạn 2 là sai. http://ptgmedia.pearsoncmg.com/images/chap13_0321169514/elementLinks/13fig02.gif – 0lukasz0
@ 0lukasz0 [Không * mọi thứ * xuất phát từ đối tượng] (http://blogs.msdn.com/b/ericlippert/archive/2009/ 08/06/not-everything-derives-from-object.aspx). – vcsjones
"struct Int32 ghi đè phương thức ValueType.ToString()" trả lời câu hỏi của riêng bạn. –