Sự khác biệt quan trọng giữa ValueTypes và loại tham chiếu là các loại giá trị có "ngữ nghĩa giá trị" này. Một DateTime, Int32 và tất cả các loại giá trị khác không có bản sắc, Int32 "42" về cơ bản không phân biệt được với bất kỳ Int32 nào khác có cùng giá trị.
Tất cả loại giá trị "đối tượng" tồn tại trên ngăn xếp hoặc là một phần của đối tượng loại tham chiếu. Một trường hợp đặc biệt là khi bạn tạo một thể hiện kiểu giá trị cho một đối tượng hoặc một giao diện - điều này được gọi là "boxing" và nó chỉ đơn giản là tạo một đối tượng kiểu tham chiếu giả mà chỉ chứa giá trị có thể được trích xuất lại ("unboxed") .
Các loại tham chiếu, mặt khác, có một danh tính. một "đối tượng mới()" không bằng bất kỳ "đối tượng mới" nào khác, bởi vì chúng là các cá thể riêng biệt trên vùng đệm GC. Một số kiểu tham chiếu cung cấp phương thức Equals và các toán tử quá tải để chúng hoạt động giống như giá trị hơn, ví dụ. một chuỗi "abc" bằng chuỗi "abc" khác ngay cả khi chúng có hai thực thể khác nhau.
Vì vậy, khi bạn có tham chiếu, nó có thể chứa địa chỉ của đối tượng hợp lệ hoặc có thể là rỗng. Khi các đối tượng kiểu giá trị là tất cả bằng không, chúng đơn giản là không. Ví dụ. một số nguyên không, một số không float, Boolean false hoặc DateTime.MinValue. Nếu bạn cần phân biệt giữa "không" và "giá trị thiếu/null", bạn cần sử dụng cờ Boolean riêng biệt hoặc tốt hơn, hãy sử dụng lớp Nullable < T> trong .NET 2.0. Đơn giản chỉ là giá trị cộng với cờ Boolean. Ngoài ra còn có sự hỗ trợ trong CLR để boxing của Nullable với HasValue = false kết quả trong một tham chiếu null, không phải trong một cấu trúc đóng hộp với false + zero, vì nó sẽ nếu bạn đã thực hiện cấu trúc này cho mình.
Nguồn
2009-03-27 12:31:06
Jon không phải là John. –